PackedList.H
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2017-2025 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 Class
28  Foam::PackedList
29 
30 Description
31  A dynamic list of packed unsigned integers, with the number of bits
32  per item specified by the <Width> template parameter.
33 
34  Resizing is similar to DynamicList so that clear() and resize() affect
35  the addressed size, but not the allocated size. The reserve() and
36  setCapacity() methods can be used to influence the allocation.
37 
38 Note
39  In a const context, the '[]' operator simply returns the stored value,
40  with out-of-range elements returned as zero.
41 
42  In a non-const context, the '[]' operator returns a reference to an
43  existing value. When accessing out-of-range elements, some caution
44  is required to ensure that the const version of the [] operator is actually
45  being called.
46  The get() method is functionally identical the the '[]' operator, but
47  is always const access.
48 
49  The set() and unset() methods return a bool if the value changed.
50 
51  With const access, the get() method and 'operator[]' are identical.
52  With non-const access, the 'operator[]' may be marginally slower get().
53 
54  The set() method may be marginally faster than using the 'operator[]'
55  supports auto-vivification and also returns a bool if the value changed,
56  which can be useful for branching on changed values.
57 
58  \code
59  list.set(5, 4);
60  changed = list.set(5, 8);
61  if (changed) ...
62  \endcode
63 
64  In a const context, reading an out-of-range element returns zero without
65  affecting the list size.
66  For example,
67  \code
68  list.resize(4);
69  Info<< list.get(10) << "\n"; // print zero, but doesn't adjust list
70  list.set(8); // auto-vivify
71  \endcode
72 
73  Also note that all unused internal storage elements are guaranteed to
74  always be bit-wise zero. This property must not be violated by any
75  inheriting classes.
76 
77 Note
78  Iterators for this class have been intentionally removed, for performance
79  reasons.
80 
81 See also
82  Foam::BitOps
83  Foam::DynamicList
84 
85 SourceFiles
86  PackedList.C
87  PackedListCore.C
88  PackedListI.H
89  PackedListIO.C
90 
91 \*---------------------------------------------------------------------------*/
92 
93 #ifndef Foam_PackedList_H
94 #define Foam_PackedList_H
95 
96 #include "className.H"
97 #include "BitOps.H"
98 #include "List.H"
99 #include "IndirectList.H"
100 #include "InfoProxy.H"
101 
102 #include <type_traits>
103 
104 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
106 namespace Foam
107 {
108 
109 // Forward Declarations
110 template<unsigned Width> class PackedList;
111 
112 template<unsigned Width>
114 
115 template<unsigned Width>
116 Ostream& operator<<(Ostream& os, const PackedList<Width>& list);
117 
118 template<unsigned Width>
119 Ostream& operator<<(Ostream& os, const InfoProxy<PackedList<Width>>& info);
120 
121 
122 /*---------------------------------------------------------------------------*\
123  Class Detail::PackedListCore Declaration
124 \*---------------------------------------------------------------------------*/
125 
126 namespace Detail
127 {
128 
129 //- Template-invariant parts for PackedList
130 struct PackedListCore
131 {
132  //- Define template name
133  ClassNameNoDebug("PackedList");
134 };
135 
136 } // End namespace Detail
137 
138 
139 /*---------------------------------------------------------------------------*\
140  Class PackedList Declaration
141 \*---------------------------------------------------------------------------*/
142 
143 template<unsigned Width>
144 class PackedList
145 :
147 {
148 public:
149 
150  // Types and dimension information
151 
152  //- The storage block type for bit elements
153  // \note Type name compatibility with boost::dynamic_bitset
154  typedef unsigned int block_type;
155 
156  //- The number of bits in a single block
157  // \note Type name compatibility with boost::dynamic_bitset
158  static constexpr unsigned bits_per_block
159  = (std::numeric_limits<block_type>::digits);
160 
161  //- The width of an individual element (in bits).
162  static constexpr unsigned element_width = (Width);
163 
164  //- The number of elements stored per data block.
165  static constexpr unsigned elem_per_block = (bits_per_block / Width);
166 
167  //- The max value for an element which is also the bit-mask of the
168  //- individual element.
169  // Eg, for Width=2: ((1 << 2) - 1) == 0b0011
170  static constexpr block_type max_value = ((1u << Width) - 1);
171 
172  //- Calculate the number of blocks required to _address_ the
173  //- requested number of elements.
174  //
175  // We calculate this:
176  // \code
177  // (numElem / elem_per_block)
178  // + (numElem % elem_per_block) ? 1 : 0
179  // \endcode
180  // But avoiding the modulus operation
181  static constexpr label num_blocks(label numElem) noexcept
182  {
183  return ((numElem - 1 + elem_per_block) / elem_per_block);
184  }
185 
186  //- Masking for all bits below the element offset.
187  // Ill-defined when elementOffset is out of range.
188  static constexpr block_type mask_lower(unsigned elementOffset)
189  {
190  return (~0u >> (bits_per_block - Width * elementOffset));
191  }
192 
193 
194 protected:
195 
196  // Protected Data
197 
198  //- The internal container for storing the blocks
200 
201  //- The blocks of raw data
203 
204  //- Number of entries used
205  label size_;
207  //- Enforce non-zero Width to fit within the block storage and require
208  //- at least 2 items per storage block for general efficiency.
209  //
210  // Thus 1/2 of the base storage size is (sizeof(block_type)*8/2),
211  // or (sizeof(block_type) << 2)
212  static_assert
213  (
214  Width && Width <= (sizeof(block_type) << 2),
215  "Width must be > 0 and minimum of two items per data block"
216  );
217 
218 
219  // Protected Member Functions
220 
221  //- A fill value for complete blocks
222  inline static unsigned int repeated_value(unsigned val);
223 
224  //- Read a list entry (allows for specialization)
225  inline static unsigned int readValue(Istream& is);
226 
227  //- Read an index/value pair and set accordingly.
228  // For bool specialization, read a single index value
229  inline void setPair(Istream& is);
230 
231  //- Write as a dictionary entry
232  void writeEntry(Ostream& os) const;
233 
234  //- Clear any partial rubbish in the last addressable block
235  // This \a rubbish may have arisen from block-wise operations etc.
236  inline void clear_trailing_bits();
237 
238  //- Copy assignment
239  inline void copyAssign(const PackedList<Width>& rhs);
240 
241  //- Find the first block with a '1' bit
242  // \return block number or -1 for an list or if all bits are OFF.
243  inline label first_block() const;
244 
245  //- Find the first block with a '0' bit
246  // \return block number or -1 for an list or if all bits are ON.
247  inline label first_not_block() const;
248 
249 
250 public:
251 
252  // Forward declaration of access classes
253 
254  class reference;
255  typedef unsigned int const_reference;
256 
257 
258  // Constructors
259 
260  //- Default construct, zero-sized and no allocation
261  inline constexpr PackedList() noexcept;
262 
263  //- Construct for given number of elements, initializes values to 0
264  inline explicit PackedList(const label numElem);
265 
266  //- Construct for given number of elements, and the specified
267  //- value for each element
268  inline PackedList(const label numElem, const unsigned int val);
269 
270  //- Construct from Istream
271  inline PackedList(Istream& is);
272 
273  //- Copy construct
274  inline PackedList(const PackedList<Width>& list);
275 
276  //- Move construct
277  inline PackedList(PackedList<Width>&& list);
278 
279  //- Copy construct a subset
280  PackedList(const PackedList<Width>& list, const labelUList& addr);
281 
282  //- Copy construct a subset
283  template<class Addr>
284  PackedList
285  (
286  const PackedList<Width>& list,
287  const IndirectListBase<label, Addr>& addr
288  );
289 
290  //- Copy construct a subset range
291  PackedList(const PackedList<Width>& list, const labelRange& range);
292 
293  //- Construct from a list of values
294  inline explicit PackedList(const labelUList& values);
295 
296  //- Construct from a indirect list of values
297  template<class Addr>
298  inline explicit PackedList(const IndirectListBase<label, Addr>& values);
299 
300  //- Clone
301  inline autoPtr<PackedList<Width>> clone() const;
302 
303 
304  // Member Functions
305 
306  // Query
307 
308  //- Check index is within valid range [0,size)
309  inline void checkIndex(const label i) const;
310 
311  //- True if the list is empty (ie, size() is zero).
312  bool empty() const noexcept { return !size_; }
313 
314  //- Number of entries.
315  label size() const noexcept { return size_; }
316 
317  //- Number of elements that can be stored without reallocating
318  inline label capacity() const noexcept;
319 
320  //- True if all entries have identical values (and list is non-empty)
321  bool uniform() const;
322 
323  //- Test for equality of sizes and the bits set
324  bool equal(const PackedList<Width>& other) const;
325 
326 
327  // Access
328 
329  //- Get value at specified index.
330  //- A no-op and returns \c 0 for out-of-range positions
331  //- (safely/silently ignores negative positions).
332  // Never auto-vivify entries.
333  inline unsigned int get(const label i) const;
334 
335  //- Set value at specified index, default value set is the max_value.
336  // Does auto-vivify for non-existent, non-zero entries.
337  // \return true if value changed.
338  inline bool set(const label i, unsigned int val = ~0u);
339 
340  //- Unset the entry at specified index.
341  //- A no-op and returns \c false for out-of-range positions
342  //- (safely/silently ignores negative positions).
343  // Never auto-vivify entries.
344  // \return true if the value changed.
345  inline bool unset(const label i);
346 
347  //- Return the values as a list of labels
348  labelList values() const;
349 
350  //- Return the values as a list of integral type.
351  // The default integral type is unsigned int.
352  template<class IntType = unsigned int>
353  List<IntType> unpack() const;
354 
355  //- Return the range of values as a list of integral type.
356  // The default integral type is unsigned int.
357  template<class IntType = unsigned int>
358  List<IntType> unpack(const labelRange& range) const;
359 
360  //- Extract the values for the specified locations as
361  //- a list of integral type.
362  // The default integral type is unsigned int.
363  template<class IntType = unsigned int>
364  List<IntType> unpack(const labelUList& locations) const;
365 
366 
367  // Edit
368 
369  //- Assign all entries to the given value.
370  inline void fill(const unsigned int val);
371 
372  //- Trim any trailing zero elements, optionally specifying a
373  //- a minimum position, below which trimming will not occur.
374  //
375  // \return true if trimming changed the size.
376  inline bool trim(label minpos = -1);
377 
378  //- Clear all bits but do not adjust the addressable size.
379  // \note Method name compatibility with boost::dynamic_bitset
380  inline void reset();
381 
382  //- Alter the size of the underlying storage.
383  // The addressed size will be truncated if needed to fit, but will
384  // remain otherwise untouched.
385  inline void setCapacity(const label numElem);
386 
387  //- Reset addressable list size, does not shrink the allocated size.
388  // Optionally specify a value for new elements.
389  inline void resize(const label numElem, const unsigned int val = 0u);
390 
391  //- Currently identical to resize. Subject to future change (Oct-2021)
392  inline void resize_nocopy(const label numElem);
393 
394  //- Reserve allocation space for at least this size
395  //- (uses a size doubling strategy).
396  // Never shrinks the allocated size.
397  inline void reserve(const label numElem);
398 
399  //- Reserve allocation space for at least this size
400  //- (uses the specified size without any other resizing strategy).
401  // Never shrinks the allocated size.
402  inline void reserve_exact(const label numElem);
403 
404  //- Clear the list, i.e. set addressable size to zero.
405  // Does not adjust the underlying storage
406  inline void clear();
407 
408  //- Clear the list and delete storage.
409  inline void clearStorage();
410 
411  //- Shrink the allocated space to what is actually used.
412  inline void shrink_to_fit();
413 
414  //- Alias for shrink_to_fit()
415  void shrink() { this->shrink_to_fit(); }
416 
417  //- Swap contents with argument
418  inline void swap(PackedList<Width>& rhs);
419 
420  //- Transfer the contents of the argument list into this list
421  //- and annul the argument list.
422  inline void transfer(PackedList<Width>& rhs);
423 
424 
425  // Low-level access
426 
427  //- The number of internal storage blocks
428  inline label num_blocks() const noexcept;
429 
430  //- Return the underlying storage blocks
431  const List<block_type>& storage() const noexcept { return blocks_; }
432 
433  //- Return the underlying storage blocks
434  // Manipulate with utmost caution
435  List<block_type>& storage() noexcept { return blocks_; }
436 
437  //- A const pointer to the raw storage
438  const block_type* cdata() const noexcept { return blocks_.cdata(); }
439 
440  //- A pointer to the raw storage
441  block_type* data() noexcept { return blocks_.data(); }
442 
443  //- A const pointer to the raw storage, reinterpreted as byte data
444  inline const char* cdata_bytes() const noexcept;
445 
446  //- A pointer to the raw storage, reinterpreted as byte data
447  inline char* data_bytes() noexcept;
448 
449  //- The number of integer blocks addressed in the raw storage.
450  //- Same as num_blocks().
451  inline std::streamsize size_data() const noexcept;
452 
453  //- The number of bytes addressed in the raw storage
454  //- including any padding.
455  inline std::streamsize size_bytes() const noexcept;
456 
457  //- Same as size_bytes()
458  inline std::streamsize byteSize() const noexcept;
459 
460 
461  // IO
462 
463  //- Print bit patterns, optionally with extra debug
464  Ostream& printBits(Ostream& os, bool debugOutput=false) const;
465 
466  //- Clear list and read from stream
467  Istream& readList(Istream& is);
468 
469  //- Write List, with line-breaks in ASCII when length exceeds shortLen.
470  // Using '0' suppresses line-breaks entirely.
471  Ostream& writeList(Ostream& os, label shortLen=0) const;
472 
473  //- Write as a dictionary entry with keyword
474  void writeEntry(const word& keyword, Ostream& os) const;
475 
476 
477  // Member Operators
478 
479  //- Append a value at the end of the list
480  inline void push_back(const unsigned int val);
481 
482  //- Reduce size by 1 or more elements. Can be called on an empty list.
483  inline void pop_back(label n = 1);
484 
485  //- Remove and return the last element
486  inline unsigned int remove();
487 
488  //- Identical to get() - get value at index.
489  // Never auto-vivify entries.
490  inline unsigned int operator[](const label i) const;
491 
492  //- Non-const access to value at index.
493  // Fatal for out-of-range indices
494  inline reference operator[](const label i);
495 
496  //- Copy assignment.
497  inline void operator=(const PackedList<Width>& list);
498 
499  //- Move assignment.
500  inline void operator=(PackedList<Width>&& list);
501 
502  //- Assign all entries to the given value. fill()
503  inline void operator=(const unsigned int val);
504 
505 
506  // Access helpers
507 
508  //- A reference supporting read/write access to an entry
509  class reference
510  {
511  protected:
512 
513  friend class PackedList; // Access for parent
514  void operator&() = delete; // Refuse to provide its address
515 
516  //- Reference to the block
517  block_type& ref_;
518 
519  //- The bit shift to access the given sub-portion
520  unsigned shift_;
521 
522  //- Construct by taking reference of block from within
523  //- the list and the specified index.
524  inline reference(PackedList* parent, const label index);
525 
526  //- Get value as unsigned, no range-checking
527  inline unsigned int get() const;
528 
529  //- Set value, returning true if changed, no range-checking
530  inline bool set(unsigned int val);
531 
532  public:
533 
534  //- Copy construct
535  reference(const reference&) noexcept = default;
536 
537  //- Move construct
538  reference(reference&&) noexcept = default;
539 
540  //- Value assignment
541  inline void operator=(const reference& other);
542 
543  //- Value assignment
544  inline void operator=(const unsigned int val);
545 
546  //- Conversion operator.
547  inline operator unsigned int () const;
548  };
550 
551  // IOstream Operators
552 
553  //- Return info proxy,
554  //- used to print information to a stream
555  InfoProxy<PackedList<Width>> info() const noexcept
556  {
557  return *this;
558  }
559 
560  friend Ostream& operator<< <Width>
561  (
562  Ostream& os,
564  );
565 
566  friend Istream& operator>> <Width>
567  (
568  Istream& is,
569  PackedList<Width>& list
570  );
571 
572 
573  // Hashing
574 
575  //- Hashing functor for PackedList
576  // Seeded with logical size for disambiguation of padding
577  struct hasher
578  {
579  unsigned operator()(const PackedList<Width>& obj) const
580  {
581  return Foam::Hasher
582  (
583  obj.cdata(),
584  obj.size_bytes(),
585  unsigned(obj.size())
586  );
587  }
588  };
589 
591  // Housekeeping
592 
593  //- Deprecated(2020-11) use fill()
594  // \deprecated(2020-11) use fill()
595  void assign(const unsigned int val) { this->fill(val); }
596 
597  //- Deprecated(2020-11) use operator=
598  // \deprecated(2020-11) use operator=
599  void assign(const PackedList<Width>& rhs) { (*this) = rhs; }
600 
601  //- Alias for resize()
602  void setSize(const label n, unsigned int val = 0u) { resize(n, val); }
603 
604  //- Append a value at the end of the list
605  //FOAM_DEPRECATED_FOR(2022-10, "push_back()")
606  PackedList<Width>& append(const unsigned int val)
607  {
608  this->push_back(val);
609  return *this;
610  }
611 };
612 
613 
614 // * * * * * * * * * * * * * * * * * Traits * * * * * * * * * * * * * * * * //
615 
616 //- Hashing for PackedList data
617 template<unsigned Width>
618 struct Hash<PackedList<Width>> : PackedList<Width>::hasher {};
619 
620 
621 // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
622 
623 //- Write List to Ostream, as per UList::writeList() with default length.
624 // The default short-length is given by Foam::ListPolicy::short_length
625 template<unsigned Width>
626 Ostream& operator<<(Ostream& os, const PackedList<Width>& list)
627 {
629 }
630 
631 
632 //- Test for equality of sizes and the bits set
633 template<unsigned Width>
634 inline bool operator==(const PackedList<Width>& a, const PackedList<Width>& b);
635 
636 //- Test for inequality of sizes or the bits set
637 template<unsigned Width>
638 inline bool operator!=(const PackedList<Width>& a, const PackedList<Width>& b);
639 
640 
641 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
642 
643 } // End namespace Foam
644 
645 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
646 
647 #include "PackedListI.H"
648 
649 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
650 
651 #ifdef NoRepository
652  #include "PackedList.C"
653  #include "PackedListIO.C"
654 #endif
655 
656 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
657 
658 #endif
659 
660 // ************************************************************************* //
void setCapacity(const label numElem)
Alter the size of the underlying storage.
Definition: PackedListI.H:517
std::streamsize size_data() const noexcept
The number of integer blocks addressed in the raw storage. Same as num_blocks().
Definition: PackedListI.H:626
PackedList< Width > & append(const unsigned int val)
Append a value at the end of the list.
Definition: PackedList.H:830
bool unset(const label i)
Unset the entry at specified index. A no-op and returns false for out-of-range positions (safely/sile...
Definition: PackedListI.H:718
std::streamsize byteSize() const noexcept
Same as size_bytes()
Definition: PackedListI.H:640
const char * cdata_bytes() const noexcept
A const pointer to the raw storage, reinterpreted as byte data.
Definition: PackedListI.H:612
A range or interval of labels defined by a start and a size.
Definition: labelRange.H:63
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Definition: Istream.H:57
std::streamsize size_bytes() const noexcept
The number of bytes addressed in the raw storage including any padding.
Definition: PackedListI.H:633
autoPtr< PackedList< Width > > clone() const
Clone.
Definition: PackedListI.H:341
void setSize(const label n, unsigned int val=0u)
Alias for resize()
Definition: PackedList.H:823
T * data() noexcept
Return pointer to the underlying array serving as data storage.
Definition: UListI.H:267
unsigned int remove()
Remove and return the last element.
Definition: PackedListI.H:755
Definition: FixedList.H:920
static constexpr unsigned bits_per_block
The number of bits in a single block.
Definition: PackedList.H:164
List< IntType > unpack() const
Return the values as a list of integral type.
static constexpr unsigned element_width
The width of an individual element (in bits).
Definition: PackedList.H:169
void setPair(Istream &is)
Read an index/value pair and set accordingly.
Definition: PackedListI.H:51
bool uniform() const
True if all entries have identical values (and list is non-empty)
Definition: PackedList.C:85
Base for lists with indirect addressing, templated on the list contents type and the addressing type...
const block_type * cdata() const noexcept
A const pointer to the raw storage.
Definition: PackedList.H:585
scalar range
UList< label > labelUList
A UList of labels.
Definition: UList.H:76
List< block_type > block_container
The internal container for storing the blocks.
Definition: PackedList.H:219
void shrink_to_fit()
Shrink the allocated space to what is actually used.
Definition: PackedListI.H:593
void resize(const label numElem, const unsigned int val=0u)
Reset addressable list size, does not shrink the allocated size.
Definition: PackedListI.H:455
label first_block() const
Find the first block with a &#39;1&#39; bit.
Definition: PackedListI.H:144
block_type * data() noexcept
A pointer to the raw storage.
Definition: PackedList.H:590
Ostream & writeList(Ostream &os, label shortLen=0) const
Write List, with line-breaks in ASCII when length exceeds shortLen.
Definition: PackedListIO.C:172
unsigned int const_reference
Definition: PackedList.H:301
void rhs(fvMatrix< typename Expr::value_type > &m, const Expr &expression)
static unsigned int repeated_value(unsigned val)
Enforce non-zero Width to fit within the block storage and require at least 2 items per storage block...
Definition: PackedListI.H:27
void writeEntry(Ostream &os) const
Write as a dictionary entry.
Definition: PackedListIO.C:27
constexpr PackedList() noexcept
Default construct, zero-sized and no allocation.
Definition: PackedListI.H:237
A dynamic list of packed unsigned integers, with the number of bits per item specified by the <Width>...
Definition: PackedList.H:105
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
Definition: createFields.H:27
Istream & operator>>(Istream &, directionInfo &)
void fill(const unsigned int val)
Assign all entries to the given value.
Definition: PackedListI.H:774
static unsigned int readValue(Istream &is)
Read a list entry (allows for specialization)
Definition: PackedListI.H:34
label size_
Number of entries used.
Definition: PackedList.H:229
unsigned operator()(const PackedList< Width > &obj) const
Definition: PackedList.H:792
bool set(const label i, unsigned int val=~0u)
Set value at specified index, default value set is the max_value.
Definition: PackedListI.H:687
void clear()
Clear the list, i.e. set addressable size to zero.
Definition: PackedListI.H:577
labelList values() const
Return the values as a list of labels.
Definition: PackedList.C:170
label first_not_block() const
Find the first block with a &#39;0&#39; bit.
Definition: PackedListI.H:164
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:56
const direction noexcept
Definition: scalarImpl.H:265
void reserve(const label numElem)
Reserve allocation space for at least this size (uses a size doubling strategy).
Definition: PackedListI.H:532
void assign(const unsigned int val)
Deprecated(2020-11) use fill()
Definition: PackedList.H:811
void swap(PackedList< Width > &rhs)
Swap contents with argument.
Definition: PackedListI.H:647
friend Ostream & operator(Ostream &os, const InfoProxy< PackedList< Width >> &info)
static constexpr block_type max_value
The max value for an element which is also the bit-mask of the individual element.
Definition: PackedList.H:182
unsigned int block_type
The storage block type for bit elements.
Definition: PackedList.H:156
bool empty() const noexcept
True if the list is empty (ie, size() is zero).
Definition: PackedList.H:387
unsigned Hasher(const void *data, size_t len, unsigned seed=0)
Bob Jenkins&#39;s 96-bit mixer hashing function (lookup3)
Definition: Hasher.C:575
decomposeUsingBbs false
Use bounding boxes (default) or unique decomposition of triangles (i.e. do not duplicate triangles) ...
char * data_bytes() noexcept
A pointer to the raw storage, reinterpreted as byte data.
Definition: PackedListI.H:619
A helper class for outputting values to Ostream.
Definition: ensightCells.H:44
tmp< GeometricField< Type, faPatchField, areaMesh > > operator &(const faMatrix< Type > &, const DimensionedField< Type, areaMesh > &)
void resize_nocopy(const label numElem)
Currently identical to resize. Subject to future change (Oct-2021)
Definition: PackedListI.H:445
Macro definitions for declaring ClassName(), NamespaceName(), etc.
void reserve_exact(const label numElem)
Reserve allocation space for at least this size (uses the specified size without any other resizing s...
Definition: PackedListI.H:551
InfoProxy< PackedList< Width > > info() const noexcept
Return info proxy, used to print information to a stream.
Definition: PackedList.H:765
const List< block_type > & storage() const noexcept
Return the underlying storage blocks.
Definition: PackedList.H:573
block_container blocks_
The blocks of raw data.
Definition: PackedList.H:224
label n
static constexpr block_type mask_lower(unsigned elementOffset)
Masking for all bits below the element offset.
Definition: PackedList.H:206
void push_back(const unsigned int val)
Append a value at the end of the list.
Definition: PackedListI.H:730
void clearStorage()
Clear the list and delete storage.
Definition: PackedListI.H:585
void copyAssign(const PackedList< Width > &rhs)
Copy assignment.
Definition: PackedListI.H:135
bool operator!=(const eddy &a, const eddy &b)
Definition: eddy.H:297
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
Definition: HashPtrTable.H:48
const T * cdata() const noexcept
Return pointer to the underlying array serving as data storage.
Definition: UListI.H:260
bool equal(const PackedList< Width > &other) const
Test for equality of sizes and the bits set.
Definition: PackedList.C:147
void reset()
Clear all bits but do not adjust the addressable size.
Definition: PackedListI.H:570
static constexpr unsigned elem_per_block
The number of elements stored per data block.
Definition: PackedList.H:174
void clear_trailing_bits()
Clear any partial rubbish in the last addressable block.
Definition: PackedListI.H:76
Number of items before requiring line-breaks in the list output.
Definition: ListPolicy.H:56
List< label > labelList
A List of labels.
Definition: List.H:61
label num_blocks() const noexcept
The number of internal storage blocks.
Definition: PackedListI.H:605
void transfer(PackedList< Width > &rhs)
Transfer the contents of the argument list into this list and annul the argument list.
Definition: PackedListI.H:660
tmp< faMatrix< Type > > operator==(const faMatrix< Type > &, const faMatrix< Type > &)
bool trim(label minpos=-1)
Trim any trailing zero elements, optionally specifying a a minimum position, below which trimming wil...
Definition: PackedListI.H:90
Istream & readList(Istream &is)
Clear list and read from stream.
Definition: PackedListIO.C:57
label capacity() const noexcept
Number of elements that can be stored without reallocating.
Definition: PackedListI.H:437
unsigned int get(const label i) const
Get value at specified index. A no-op and returns 0 for out-of-range positions (safely/silently ignor...
Definition: PackedListI.H:674
void shrink()
Alias for shrink_to_fit()
Definition: PackedList.H:549
Ostream & printBits(Ostream &os, bool debugOutput=false) const
Print bit patterns, optionally with extra debug.
Definition: PackedListIO.C:37
label size() const noexcept
Number of entries.
Definition: PackedList.H:392
Namespace for OpenFOAM.
void checkIndex(const label i) const
Check index is within valid range [0,size)
Definition: PackedListI.H:419
ClassNameNoDebug("PackedList")
Define template name.
Template-invariant parts for PackedList.
Definition: PackedList.H:127
void pop_back(label n=1)
Reduce size by 1 or more elements. Can be called on an empty list.
Definition: PackedListI.H:741