Go to the documentation of this file.
33 template<
unsigned W
idth>
36 return BitOps::repeat_value<block_type,Width>(val);
40 template<
unsigned W
idth>
48 <<
"Out-of-range value " << val <<
" for PackedList<" << Width
49 <<
">. Maximum permitted value is " << max_value <<
"."
57 template<
unsigned W
idth>
65 is.
readEnd(
"Tuple2<label,uint32>");
70 <<
"Out-of-range value " << val <<
" for PackedList<" << Width
71 <<
"> at index " << ind
72 <<
". Maximum permitted value is " << max_value <<
"."
82 template<
unsigned W
idth>
86 const unsigned int blk = size() / elem_per_block;
87 const unsigned int off = size() % elem_per_block;
91 blocks_[blk] &= mask_lower(off);
96 template<
unsigned W
idth>
104 const label orig = size();
110 for (label blocki = num_blocks(size())-1; blocki >= 0; --blocki)
113 size_ = blocki * elem_per_block;
115 unsigned int blockval = blocks_[blocki];
120 for (; blockval; ++size_)
126 else if (size_ < minpos)
137 return (size() != orig);
141 template<
unsigned W
idth>
158 return (val ? ~0u : 0u);
176 template<
unsigned W
idth>
184 template<
unsigned W
idth>
187 blocks_(num_blocks(numElem), 0u),
192 template<
unsigned W
idth>
196 const unsigned int val
199 blocks_(num_blocks(numElem), 0u),
209 template<
unsigned W
idth>
219 template<
unsigned W
idth>
222 blocks_(list.blocks_),
227 template<
unsigned W
idth>
230 blocks_(std::move(list.blocks_)),
237 template<
unsigned W
idth>
240 blocks_(num_blocks(
values.size()), 0u),
243 const label len =
values.size();
248 for (label i = 0; i < len; ++i)
250 const unsigned int val(
values[i]);
251 if (val)
set(i, val);
256 template<
unsigned W
idth>
263 blocks_(num_blocks(
values.size()), 0u),
266 const label len =
values.size();
271 for (label i = 0; i < len; ++i)
273 const unsigned int val(
values[i]);
274 if (val)
set(i, val);
279 template<
unsigned W
idth>
289 template<
unsigned W
idth>
296 ref_(parent->blocks_[index / elem_per_block]),
297 shift_(Width * (index % elem_per_block))
301 template<
unsigned W
idth>
308 template<
unsigned W
idth>
311 const unsigned int mask = (
max_value << shift_);
312 const unsigned int prev = ref_;
321 ref_ |= mask & (val << shift_);
324 return (prev != ref_);
328 template<
unsigned W
idth>
335 this->
set(other.get());
339 template<
unsigned W
idth>
342 const unsigned int val
349 template<
unsigned W
idth>
358 template<
unsigned W
idth>
364 <<
"attempt to access element " << i <<
" from zero sized list"
367 else if (i < 0 || i >=
size_)
370 <<
"index " << i <<
" out of range [0," <<
size_ <<
")"
376 template<
unsigned W
idth>
383 template<
unsigned W
idth>
390 template<
unsigned W
idth>
397 template<
unsigned W
idth>
407 template<
unsigned W
idth>
411 const unsigned int val
416 const label oldSize =
size();
419 if (oldSize < newSize)
430 for (label blocki = oldLen; blocki < newLen; ++blocki)
444 blocks_[blk] |= ~mask & blockval;
451 else if (newSize < oldSize)
460 for (label blocki = newLen; blocki < oldLen; ++blocki)
470 template<
unsigned W
idth>
477 if (numElem <
size())
485 template<
unsigned W
idth>
488 const label oldLen =
blocks_.size();
497 max(16,
max(newLen, 2*oldLen)),
504 template<
unsigned W
idth>
511 template<
unsigned W
idth>
519 template<
unsigned W
idth>
527 template<
unsigned W
idth>
539 template<
unsigned W
idth>
546 template<
unsigned W
idth>
553 template<
unsigned W
idth>
560 template<
unsigned W
idth>
567 template<
unsigned W
idth>
574 template<
unsigned W
idth>
581 template<
unsigned W
idth>
588 template<
unsigned W
idth>
595 template<
unsigned W
idth>
602 template<
unsigned W
idth>
615 template<
unsigned W
idth>
629 template<
unsigned W
idth>
632 if (i < 0 || i >=
size())
638 <<
"Ignoring attempt to get a negative index " << i
639 <<
" range is [0," <<
size_ <<
")"
651 template<
unsigned W
idth>
655 const unsigned int val
662 <<
"Ignoring attempt to set a negative index " << i
663 <<
" range is [0," <<
size_ <<
")"
669 else if (i >=
size())
679 return reference(
this, i).set(val);
683 template<
unsigned W
idth>
686 if (i < 0 || i >=
size())
691 return reference(
this, i).set(0u);
695 template<
unsigned W
idth>
699 const label idx =
size();
703 reference(
this, idx).set(val);
708 template<
unsigned W
idth>
712 const label idx =
size()-1;
720 const unsigned int old = reference(
this, idx).get();
727 template<
unsigned W
idth>
740 for (label blocki=0; blocki < nblocks; ++blocki)
754 template<
unsigned W
idth>
761 template<
unsigned W
idth>
768 return reference(
this, i);
772 template<
unsigned W
idth>
779 template<
unsigned W
idth>
786 template<
unsigned W
idth>
795 template<
unsigned W
idth>
796 inline bool Foam::operator==
806 template<
unsigned W
idth>
807 inline bool Foam::operator!=
void reset()
Clear all bits but do not adjust the addressable size.
void resize(const label numElem, const unsigned int val=0u)
Reset addressable list size, does not shrink the allocated size.
bool set(unsigned int val)
Set value, returning true if changed, no range-checking.
void set(List< bool > &bools, const labelRange &range)
Set the specified range 'on' in a boolList.
block_type & ref_
Reference to the block.
void reserve(const label numElem)
Reserve allocation space for at least this size.
void resize(const label len)
Adjust allocated size of list.
A reference supporting read/write access to an entry.
List< T > values(const HashTable< T, Key, Hash > &tbl, const bool doSort=false)
List of values from HashTable, optionally sorted.
autoPtr< PackedList< Width > > clone() const
Clone.
unsigned int block_type
The storage block type for bit elements.
reference(PackedList *parent, const label index)
std::streamsize size_bytes() const noexcept
label nBlocks() const
The number of internal storage blocks.
void clear_trailing_bits()
Clear any partial rubbish in the last addressable block.
bool empty() const noexcept
True if the list is empty (ie, size() is zero).
Ostream & endl(Ostream &os)
Add newline and flush stream.
constexpr PackedList() noexcept
Default construct, zero-sized and no allocation.
bool readEnd(const char *funcName)
End read of data chunk, ends with ')'.
void checkIndex(const label i) const
Check index is within valid range [0,size)
void swap(PackedList< Width > &rhs)
Swap contents with argument.
unsigned int get(const label i) const
Get value at index i or 0 for out-of-range.
unsigned int get() const
Get value as unsigned, no range-checking.
bool readBegin(const char *funcName)
Begin read of data chunk, starts with '('.
const char * cdata_bytes() const noexcept
A const pointer to the raw storage, reinterpreted as byte data.
static constexpr block_type mask_lower(unsigned elementOffset)
Masking for all bits below the element offset.
label size_
Number of entries used.
unsigned int * data() noexcept
A pointer to the raw storage.
block_container blocks_
The blocks of raw data.
static unsigned int repeated_value(unsigned val)
A fill value for complete blocks.
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
bool readBool(Istream &is)
Read bool from stream using Foam::Switch(Istream&)
void transfer(List< T > &list)
bool unset(const label i)
Unset the entry at index i.
unsigned int remove()
Remove and return the last element.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
void fill(const unsigned int val)
Assign all entries to the given value.
const unsigned int * cdata() const noexcept
A const pointer to the raw storage.
unsigned int operator[](const label i) const
Identical to get() - get value at index.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
void transfer(PackedList< Width > &rhs)
errorManip< error > abort(error &err)
PackedList< Width > & append(const unsigned int val)
Append a value at the end of the list.
bool equal(const PackedList< Width > &other) const
Test for equality of sizes and the bits set.
void setPair(Istream &is)
Read an index/value pair and set accordingly.
static constexpr block_type max_value
errorManipArg< error, int > exit(error &err, const int errNo=1)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
static constexpr unsigned elem_per_block
The number of elements stored per data block.
label readLabel(const char *buf)
Parse entire buffer as a label, skipping leading/trailing whitespace.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
A dynamic list of packed unsigned integers, with the number of bits per item specified by the <Width>...
void operator=(const PackedList< Width > &lst)
Copy assignment.
label size() const noexcept
Number of entries.
void clear()
Clear the list, i.e. set size to zero.
bool trim(label minpos=-1)
const List< unsigned int > & storage() const
Return the underlying storage blocks.
char * data_bytes() noexcept
A pointer to the raw storage, reinterpreted as byte data.
void clearStorage()
Clear the list and delete storage.
bool set(const label i, unsigned int val=~0u)
Set value at index i, default value set is the max_value.
void shrink()
Shrink the allocated space to what is actually used.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Base for lists with indirect addressing, templated on the list contents type and the addressing type....
std::streamsize byteSize() const noexcept
void resize_nocopy(const label numElem)
Currently identical to resize. Subject to future change (Oct-2021)
unsigned shift_
The bit shift to access the given sub-portion.
label capacity() const noexcept
The number of elements that can be stored with reallocating.
void copyAssign(const PackedList< Width > &rhs)
Copy assignment.
#define WarningInFunction
Report a warning using Foam::Warning.
static constexpr label num_blocks(label numElem) noexcept
void clear()
Clear the list, i.e. set addressable size to zero.
static unsigned int readValue(Istream &is)
Read a list entry (allows for specialization)
void setCapacity(const label numElem)
Alter the size of the underlying storage.