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-2023 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  PackedListI.H
87  PackedList.C
88  PackedListIO.C
89 
90 \*---------------------------------------------------------------------------*/
91 
92 #ifndef Foam_PackedList_H
93 #define Foam_PackedList_H
94 
95 #include "BitOps.H"
96 #include "labelList.H"
97 #include "IndirectListBase.H"
98 #include "InfoProxy.H"
99 #include "PackedListCore.H"
100 
101 #include <type_traits>
102 
103 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
105 namespace Foam
106 {
107 
108 // Forward Declarations
109 template<unsigned Width> class PackedList;
110 class labelRange;
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 PackedList Declaration
124 \*---------------------------------------------------------------------------*/
125 
126 template<unsigned Width>
127 class PackedList
128 :
130 {
131 public:
132 
133  // Types and dimension information
134 
135  //- The storage block type for bit elements
136  // \note Type name compatibility with boost::dynamic_bitset
137  typedef unsigned int block_type;
138 
139  //- The number of bits in a single block
140  // \note Type name compatibility with boost::dynamic_bitset
141  static constexpr unsigned bits_per_block
142  = (std::numeric_limits<block_type>::digits);
144  //- The width of an individual element (in bits).
145  static constexpr unsigned element_width = (Width);
146 
147  //- The number of elements stored per data block.
148  static constexpr unsigned elem_per_block = (bits_per_block / Width);
149 
150  //- The max value for an element which is also the bit-mask of the
151  //- individual element.
152  // Eg, for Width=2: ((1 << 2) - 1) == 0b0011
153  static constexpr block_type max_value = ((1u << Width) - 1);
154 
155  //- Calculate the number of blocks required to _address_ the
156  //- requested number of elements.
157  //
158  // We calculate this:
159  // \code
160  // (numElem / elem_per_block)
161  // + (numElem % elem_per_block) ? 1 : 0
162  // \endcode
163  // But avoiding the modulus operation
164  static constexpr label num_blocks(label numElem) noexcept
165  {
166  return ((numElem - 1 + elem_per_block) / elem_per_block);
167  }
168 
169  //- Masking for all bits below the element offset.
170  // Ill-defined when elementOffset is out of range.
171  static constexpr block_type mask_lower(unsigned elementOffset)
172  {
173  return (~0u >> (bits_per_block - Width * elementOffset));
174  }
176 
177 protected:
178 
179  // Protected Data
180 
181  //- The internal container for storing the blocks
183 
184  //- The blocks of raw data
186 
187  //- Number of entries used
188  label size_;
189 
190  //- Enforce non-zero Width to fit within the block storage and require
191  //- at least 2 items per storage block for general efficiency.
192  //
193  // Thus 1/2 of the base storage size is (sizeof(block_type)*8/2),
194  // or (sizeof(block_type) << 2)
195  static_assert
196  (
197  Width && Width <= (sizeof(block_type) << 2),
198  "Width must be > 0 and minimum of two items per data block"
199  );
200 
201 
202  // Protected Member Functions
204  //- A fill value for complete blocks
205  inline static unsigned int repeated_value(unsigned val);
206 
207  //- Read a list entry (allows for specialization)
208  inline static unsigned int readValue(Istream& is);
209 
210  //- Read an index/value pair and set accordingly.
211  // For bool specialization, read a single index value
212  inline void setPair(Istream& is);
213 
214  //- Write as a dictionary entry
215  void writeEntry(Ostream& os) const;
216 
217  //- Clear any partial rubbish in the last addressable block
218  // This \a rubbish may have arisen from block-wise operations etc.
219  inline void clear_trailing_bits();
220 
221  //- Copy assignment
222  inline void copyAssign(const PackedList<Width>& rhs);
223 
224  //- Find the first block with a '1' bit
225  // \return block number or -1 for an list or if all bits are OFF.
226  inline label first_block() const;
227 
228  //- Find the first block with a '0' bit
229  // \return block number or -1 for an list or if all bits are ON.
230  inline label first_not_block() const;
231 
232 
233 public:
234 
235  // Forward declaration of access classes
236 
237  class reference;
238  typedef unsigned int const_reference;
239 
240 
241  // Constructors
242 
243  //- Default construct, zero-sized and no allocation
244  inline constexpr PackedList() noexcept;
245 
246  //- Construct for given number of elements, initializes values to 0
247  inline explicit PackedList(const label numElem);
248 
249  //- Construct for given number of elements, and the specified
250  //- value for each element
251  inline PackedList(const label numElem, const unsigned int val);
252 
253  //- Construct from Istream
254  inline PackedList(Istream& is);
255 
256  //- Copy construct
257  inline PackedList(const PackedList<Width>& list);
258 
259  //- Move construct
260  inline PackedList(PackedList<Width>&& list);
261 
262  //- Copy construct a subset
263  PackedList(const PackedList<Width>& list, const labelUList& addr);
264 
265  //- Copy construct a subset
266  template<class Addr>
267  PackedList
268  (
269  const PackedList<Width>& list,
270  const IndirectListBase<label, Addr>& addr
271  );
272 
273  //- Copy construct a subset range
274  PackedList(const PackedList<Width>& list, const labelRange& range);
275 
276  //- Construct from a list of values
277  inline explicit PackedList(const labelUList& values);
278 
279  //- Construct from a indirect list of values
280  template<class Addr>
281  inline explicit PackedList(const IndirectListBase<label, Addr>& values);
282 
283  //- Clone
284  inline autoPtr<PackedList<Width>> clone() const;
285 
286 
287  // Member Functions
288 
289  // Query
290 
291  //- Check index is within valid range [0,size)
292  inline void checkIndex(const label i) const;
293 
294  //- True if the list is empty (ie, size() is zero).
295  bool empty() const noexcept { return !size_; }
296 
297  //- Number of entries.
298  label size() const noexcept { return size_; }
299 
300  //- Number of elements that can be stored without reallocating
301  inline label capacity() const noexcept;
302 
303  //- True if all entries have identical values (and list is non-empty)
304  bool uniform() const;
305 
306  //- Test for equality of sizes and the bits set
307  bool equal(const PackedList<Width>& other) const;
308 
309 
310  // Access
311 
312  //- Get value at index i or 0 for out-of-range.
313  // Never auto-vivify entries.
314  inline unsigned int get(const label i) const;
315 
316  //- Set value at index i, default value set is the max_value.
317  // Does auto-vivify for non-existent, non-zero entries.
318  // \return true if value changed.
319  inline bool set(const label i, unsigned int val = ~0u);
320 
321  //- Unset the entry at index i.
322  // Never auto-vivify entries.
323  // \return true if the value changed.
324  inline bool unset(const label i);
325 
326  //- Return the values as a list of labels
327  labelList values() const;
328 
329  //- Return the values as a list of integral type.
330  // The default integral type is unsigned int.
331  template<class IntType = unsigned int>
332  List<IntType> unpack() const;
333 
334  //- Return the range of values as a list of integral type.
335  // The default integral type is unsigned int.
336  template<class IntType = unsigned int>
337  List<IntType> unpack(const labelRange& range) const;
338 
339  //- Extract the values for the specified locations as
340  //- a list of integral type.
341  // The default integral type is unsigned int.
342  template<class IntType = unsigned int>
343  List<IntType> unpack(const labelUList& locations) const;
344 
345 
346  // Edit
347 
348  //- Assign all entries to the given value.
349  inline void fill(const unsigned int val);
350 
351  //- Trim any trailing zero elements, optionally specifying a
352  //- a minimum position, below which trimming will not occur.
353  //
354  // \return true if trimming changed the size.
355  inline bool trim(label minpos = -1);
356 
357  //- Clear all bits but do not adjust the addressable size.
358  // \note Method name compatibility with boost::dynamic_bitset
359  inline void reset();
360 
361  //- Alter the size of the underlying storage.
362  // The addressed size will be truncated if needed to fit, but will
363  // remain otherwise untouched.
364  inline void setCapacity(const label numElem);
365 
366  //- Reset addressable list size, does not shrink the allocated size.
367  // Optionally specify a value for new elements.
368  inline void resize(const label numElem, const unsigned int val = 0u);
369 
370  //- Currently identical to resize. Subject to future change (Oct-2021)
371  inline void resize_nocopy(const label numElem);
372 
373  //- Reserve allocation space for at least this size
374  //- (uses a size doubling strategy).
375  // Never shrinks the allocated size.
376  inline void reserve(const label numElem);
377 
378  //- Clear the list, i.e. set addressable size to zero.
379  // Does not adjust the underlying storage
380  inline void clear();
381 
382  //- Clear the list and delete storage.
383  inline void clearStorage();
384 
385  //- Shrink the allocated space to what is actually used.
386  inline void shrink();
387 
388  //- Swap contents with argument
389  inline void swap(PackedList<Width>& rhs);
390 
391  //- Transfer the contents of the argument list into this list
392  //- and annul the argument list.
393  inline void transfer(PackedList<Width>& rhs);
394 
395 
396  // Low-level access
397 
398  //- The number of internal storage blocks
399  inline label nBlocks() const;
400 
401  //- Return the underlying storage blocks
402  inline const List<unsigned int>& storage() const;
403 
404  //- Return the underlying storage blocks
405  // Manipulate with utmost caution
406  inline List<unsigned int>& storage();
407 
408  //- A const pointer to the raw storage
409  inline const unsigned int* cdata() const noexcept;
410 
411  //- A pointer to the raw storage
412  inline unsigned int* data() noexcept;
413 
414  //- A const pointer to the raw storage, reinterpreted as byte data
415  inline const char* cdata_bytes() const noexcept;
416 
417  //- A pointer to the raw storage, reinterpreted as byte data
418  inline char* data_bytes() noexcept;
419 
420  //- The number of integer blocks addressed in the raw storage
421  inline std::streamsize size_data() const noexcept;
422 
423  //- The number of bytes used in the raw storage
424  //- including any unused padding.
425  inline std::streamsize size_bytes() const noexcept;
426 
427  //- The number of bytes used in the raw storage
428  //- including any unused padding.
429  inline std::streamsize byteSize() const noexcept;
430 
431 
432  // IO
433 
434  //- Print bit patterns, optionally with extra debug
435  Ostream& printBits(Ostream& os, bool debugOutput=false) const;
436 
437  //- Clear list and read from stream
438  Istream& readList(Istream& is);
439 
440  //- Write List, with line-breaks in ASCII when length exceeds shortLen.
441  // Using '0' suppresses line-breaks entirely.
442  Ostream& writeList(Ostream& os, const label shortLen=0) const;
443 
444  //- Write as a dictionary entry with keyword
445  void writeEntry(const word& keyword, Ostream& os) const;
446 
447 
448  // Member Operators
449 
450  //- Append a value at the end of the list
451  inline void push_back(const unsigned int val);
452 
453  //- Reduce size by 1 or more elements. Can be called on an empty list.
454  inline void pop_back(label n = 1);
455 
456  //- Remove and return the last element
457  inline unsigned int remove();
458 
459  //- Identical to get() - get value at index.
460  // Never auto-vivify entries.
461  inline unsigned int operator[](const label i) const;
462 
463  //- Non-const access to value at index.
464  // Fatal for out-of-range indices
465  inline reference operator[](const label i);
466 
467  //- Copy assignment.
468  inline void operator=(const PackedList<Width>& list);
469 
470  //- Move assignment.
471  inline void operator=(PackedList<Width>&& list);
472 
473  //- Assign all entries to the given value. fill()
474  inline void operator=(const unsigned int val);
475 
476 
477  // Access helpers
478 
479  //- A reference supporting read/write access to an entry
480  class reference
481  {
482  protected:
483 
484  friend class PackedList; // Access for parent
485  void operator&() = delete; // Refuse to provide its address
486 
487  //- Reference to the block
488  block_type& ref_;
489 
490  //- The bit shift to access the given sub-portion
491  unsigned shift_;
492 
493  //- Construct by taking reference of block from within
494  //- the list and the specified index.
495  inline reference(PackedList* parent, const label index);
496 
497  //- Get value as unsigned, no range-checking
498  inline unsigned int get() const;
499 
500  //- Set value, returning true if changed, no range-checking
501  inline bool set(unsigned int val);
502 
503  public:
504 
505  //- Copy construct
506  reference(const reference&) = default;
507 
508  //- Move construct
509  reference(reference&&) = default;
510 
511  //- Value assignment
512  inline void operator=(const reference& other);
513 
514  //- Value assignment
515  inline void operator=(const unsigned int val);
516 
517  //- Conversion operator.
518  inline operator unsigned int () const;
519  };
520 
521 
522  // IOstream Operators
523 
524  //- Return info proxy,
525  //- used to print information to a stream
527  {
528  return *this;
529  }
530 
531  friend Ostream& operator<< <Width>
532  (
533  Ostream& os,
534  const InfoProxy<PackedList<Width>>& info
535  );
536 
537  friend Istream& operator>> <Width>
538  (
539  Istream& is,
540  PackedList<Width>& list
541  );
542 
543 
544  // Hashing
545 
546  //- Hashing functor for PackedList
547  // Seeded with logical size for disambiguation of padding
548  struct hasher
549  {
550  unsigned operator()(const PackedList<Width>& obj) const
551  {
552  return Foam::Hasher
553  (
554  obj.cdata(),
555  obj.size_bytes(),
556  unsigned(obj.size())
557  );
558  }
559  };
560 
561 
562  // Housekeeping
563 
564  //- Deprecated(2020-11) use fill()
565  // \deprecated(2020-11) use fill()
566  void assign(const unsigned int val) { this->fill(val); }
567 
568  //- Deprecated(2020-11) use operator=
569  // \deprecated(2020-11) use operator=
570  void assign(const PackedList<Width>& rhs) { (*this) = rhs; }
571 
572  //- Alias for resize()
573  void setSize(const label n, unsigned int val = 0u) { resize(n, val); }
574 
575  //- Append a value at the end of the list
576  //FOAM_DEPRECATED_FOR(2022-10, "push_back()")
577  PackedList<Width>& append(const unsigned int val)
578  {
579  this->push_back(val);
580  return *this;
581  }
582 };
583 
584 
585 // * * * * * * * * * * * * * * * * * Traits * * * * * * * * * * * * * * * * //
586 
587 //- Hashing for PackedList data
588 template<unsigned Width>
589 struct Hash<PackedList<Width>> : PackedList<Width>::hasher {};
590 
591 
592 // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
593 
594 //- Write List to Ostream, as per UList::writeList() with default length.
595 // The default short-length is given by Detail::ListPolicy::short_length
596 template<unsigned Width>
597 Ostream& operator<<(Ostream& os, const PackedList<Width>& list)
598 {
599  return list.writeList(os, Detail::ListPolicy::short_length<void>::value);
600 }
601 
602 
603 //- Test for equality of sizes and the bits set
604 template<unsigned Width>
605 inline bool operator==(const PackedList<Width>& a, const PackedList<Width>& b);
606 
607 //- Test for inequality of sizes or the bits set
608 template<unsigned Width>
609 inline bool operator!=(const PackedList<Width>& a, const PackedList<Width>& b);
610 
611 
612 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
613 
614 } // End namespace Foam
615 
616 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
617 
618 #include "PackedListI.H"
619 
620 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
621 
622 #ifdef NoRepository
623  #include "PackedList.C"
624  #include "PackedListIO.C"
625 #endif
626 
627 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
628 
629 #endif
630 
631 // ************************************************************************* //
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.
Definition: PackedListI.H:635
PackedList< Width > & append(const unsigned int val)
Append a value at the end of the list.
Definition: PackedList.H:792
bool unset(const label i)
Unset the entry at index i.
Definition: PackedListI.H:737
std::streamsize byteSize() const noexcept
The number of bytes used in the raw storage including any unused padding.
Definition: PackedListI.H:649
const char * cdata_bytes() const noexcept
A const pointer to the raw storage, reinterpreted as byte data.
Definition: PackedListI.H:621
A range or interval of labels defined by a start and a size.
Definition: labelRange.H:52
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 used in the raw storage including any unused padding.
Definition: PackedListI.H:642
autoPtr< PackedList< Width > > clone() const
Clone.
Definition: PackedListI.H:341
const List< unsigned int > & storage() const
Return the underlying storage blocks.
Definition: PackedListI.H:593
void setSize(const label n, unsigned int val=0u)
Alias for resize()
Definition: PackedList.H:785
unsigned int remove()
Remove and return the last element.
Definition: PackedListI.H:774
static constexpr unsigned bits_per_block
The number of bits in a single block.
Definition: PackedList.H:143
List< IntType > unpack() const
Return the values as a list of integral type.
Ostream & writeList(Ostream &os, const label shortLen=0) const
Write List, with line-breaks in ASCII when length exceeds shortLen.
Definition: PackedListIO.C:172
static constexpr unsigned element_width
The width of an individual element (in bits).
Definition: PackedList.H:148
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:86
Base for lists with indirect addressing, templated on the list contents type and the addressing type...
scalar range
UList< label > labelUList
A UList of labels.
Definition: UList.H:78
List< block_type > block_container
The internal container for storing the blocks.
Definition: PackedList.H:198
label nBlocks() const
The number of internal storage blocks.
Definition: PackedListI.H:600
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
unsigned int const_reference
Definition: PackedList.H:280
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:104
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
Definition: createFields.H:27
A class for handling words, derived from Foam::string.
Definition: word.H:63
Istream & operator>>(Istream &, directionInfo &)
void fill(const unsigned int val)
Assign all entries to the given value.
Definition: PackedListI.H:793
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:208
unsigned operator()(const PackedList< Width > &obj) const
Definition: PackedList.H:754
bool set(const label i, unsigned int val=~0u)
Set value at index i, default value set is the max_value.
Definition: PackedListI.H:706
void clear()
Clear the list, i.e. set addressable size to zero.
Definition: PackedListI.H:558
labelList values() const
Return the values as a list of labels.
Definition: PackedList.C:171
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: Scalar.H:258
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:773
OBJstream os(runTime.globalPath()/outputName)
void swap(PackedList< Width > &rhs)
Swap contents with argument.
Definition: PackedListI.H:656
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:161
unsigned int block_type
The storage block type for bit elements.
Definition: PackedList.H:135
bool empty() const noexcept
True if the list is empty (ie, size() is zero).
Definition: PackedList.H:366
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
char * data_bytes() noexcept
A pointer to the raw storage, reinterpreted as byte data.
Definition: PackedListI.H:628
A helper class for outputting values to Ostream.
Definition: ensightCells.H:43
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
unsigned int * data() noexcept
A pointer to the raw storage.
Definition: PackedListI.H:614
InfoProxy< PackedList< Width > > info() const noexcept
Return info proxy, used to print information to a stream.
Definition: PackedList.H:727
block_container blocks_
The blocks of raw data.
Definition: PackedList.H:203
label n
static constexpr block_type mask_lower(unsigned elementOffset)
Masking for all bits below the element offset.
Definition: PackedList.H:185
void push_back(const unsigned int val)
Append a value at the end of the list.
Definition: PackedListI.H:749
void clearStorage()
Clear the list and delete storage.
Definition: PackedListI.H:566
void copyAssign(const PackedList< Width > &rhs)
Copy assignment.
Definition: PackedListI.H:135
static constexpr label num_blocks(label numElem) noexcept
Calculate the number of blocks required to _address_ the requested number of elements.
Definition: PackedList.H:175
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
bool equal(const PackedList< Width > &other) const
Test for equality of sizes and the bits set.
Definition: PackedList.C:148
void reset()
Clear all bits but do not adjust the addressable size.
Definition: PackedListI.H:551
static constexpr unsigned elem_per_block
The number of elements stored per data block.
Definition: PackedList.H:153
void clear_trailing_bits()
Clear any partial rubbish in the last addressable block.
Definition: PackedListI.H:76
List< label > labelList
A List of labels.
Definition: List.H:62
const unsigned int * cdata() const noexcept
A const pointer to the raw storage.
Definition: PackedListI.H:607
void transfer(PackedList< Width > &rhs)
Transfer the contents of the argument list into this list and annul the argument list.
Definition: PackedListI.H:669
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
void operator=(const PackedList< Width > &list)
Copy assignment.
Definition: PackedListI.H:838
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 index i or 0 for out-of-range.
Definition: PackedListI.H:683
void shrink()
Shrink the allocated space to what is actually used.
Definition: PackedListI.H:574
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:371
Namespace for OpenFOAM.
void checkIndex(const label i) const
Check index is within valid range [0,size)
Definition: PackedListI.H:419
Template-invariant parts for PackedList.
void pop_back(label n=1)
Reduce size by 1 or more elements. Can be called on an empty list.
Definition: PackedListI.H:760