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>
60 is.readBegin(
"Tuple2<label,uint32>");
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>
145 blocks_ = rhs.blocks_;
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>
260 const IndirectListBase<label, Addr>&
values 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>
283 return autoPtr<PackedList<Width>>
::New(*
this);
289 template<
unsigned W
idth>
292 PackedList<Width>* parent,
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>
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>
698 const label idx =
size();
702 reference(
this, idx).set(val);
706 template<
unsigned W
idth>
720 template<
unsigned W
idth>
724 const label idx =
size()-1;
732 const unsigned int old = reference(
this, idx).get();
739 template<
unsigned W
idth>
752 for (label blocki=0; blocki < nblocks; ++blocki)
766 template<
unsigned W
idth>
773 template<
unsigned W
idth>
780 return reference(
this, i);
784 template<
unsigned W
idth>
791 template<
unsigned W
idth>
798 template<
unsigned W
idth>
807 template<
unsigned W
idth>
808 inline bool Foam::operator==
810 const PackedList<Width>& a,
811 const PackedList<Width>&
b 818 template<
unsigned W
idth>
819 inline bool Foam::operator!=
821 const PackedList<Width>& a,
822 const PackedList<Width>&
b void setCapacity(const label numElem)
Alter the size of the underlying storage.
void size(const label n)
Older name for setAddressableSize.
label size() const noexcept
Number of entries.
unsigned int get() const
Get value as unsigned, no range-checking.
errorManipArg< error, int > exit(error &err, const int errNo=1)
bool unset(const label i)
Unset the entry at index i.
void resize(const label len)
Adjust allocated size of list.
void transfer(List< T > &list)
Transfer the contents of the argument List into this list and annul the argument list.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
std::streamsize byteSize() const noexcept
The number of bytes used in the raw storage including any unused padding.
const char * cdata_bytes() const noexcept
A const pointer to the raw storage, reinterpreted as byte data.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
std::streamsize size_bytes() const noexcept
The number of bytes used in the raw storage including any unused padding.
autoPtr< PackedList< Width > > clone() const
Clone.
const List< unsigned int > & storage() const
Return the underlying storage blocks.
T * data() noexcept
Return pointer to the underlying array serving as data storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
unsigned int remove()
Remove and return the last element.
label readLabel(const char *buf)
Parse entire buffer as a label, skipping leading/trailing whitespace.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
unsigned int operator[](const label i) const
Identical to get() - get value at index.
void setPair(Istream &is)
Read an index/value pair and set accordingly.
void operator=(const PackedList< Width > &lst)
Copy assignment.
char * data_bytes() noexcept
Return pointer to the underlying array serving as data storage,.
void swap(UList< T > &list)
Swap content with another UList of the same type in constant time.
A reference supporting read/write access to an entry.
label nBlocks() const
The number of internal storage blocks.
void resize(const label numElem, const unsigned int val=0u)
Reset addressable list size, does not shrink the allocated size.
const char * cdata_bytes() const noexcept
Return pointer to the underlying array serving as data storage,.
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...
List< T > values(const HashTable< T, Key, Hash > &tbl, const bool doSort=false)
List of values from HashTable, optionally sorted.
constexpr PackedList() noexcept
Default construct, zero-sized and no allocation.
A dynamic list of packed unsigned integers, with the number of bits per item specified by the <Width>...
const dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
void clear()
Clear the list, i.e. set size to zero.
void fill(const unsigned int val)
Assign all entries to the given value.
static unsigned int readValue(Istream &is)
Read a list entry (allows for specialization)
label size_
Number of entries used.
bool set(unsigned int val)
Set value, returning true if changed, no range-checking.
bool set(const label i, unsigned int val=~0u)
Set value at index i, default value set is the max_value.
errorManip< error > abort(error &err)
void clear()
Clear the list, i.e. set addressable size to zero.
void reserve(const label numElem)
Reserve allocation space for at least this size (uses a size doubling strategy).
unsigned shift_
The bit shift to access the given sub-portion.
block_type & ref_
Reference to the block.
void swap(PackedList< Width > &rhs)
Swap contents with argument.
static constexpr block_type max_value
The max value for an element which is also the bit-mask of the individual element.
unsigned int block_type
The storage block type for bit elements.
bool empty() const noexcept
True if the list is empty (ie, size() is zero).
char * data_bytes() noexcept
A pointer to the raw storage, reinterpreted as byte data.
#define WarningInFunction
Report a warning using Foam::Warning.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
void resize_nocopy(const label numElem)
Currently identical to resize. Subject to future change (Oct-2021)
unsigned int * data() noexcept
A pointer to the raw storage.
block_container blocks_
The blocks of raw data.
static constexpr block_type mask_lower(unsigned elementOffset)
Masking for all bits below the element offset.
void push_back(const unsigned int val)
Append a value at the end of the list.
void clearStorage()
Clear the list and delete storage.
void copyAssign(const PackedList< Width > &rhs)
Copy assignment.
static constexpr label num_blocks(label numElem) noexcept
Calculate the number of blocks required to _address_ the requested number of elements.
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
const T * cdata() const noexcept
Return pointer to the underlying array serving as data storage.
void reset()
Clear all bits but do not adjust the addressable size.
static constexpr unsigned elem_per_block
The number of elements stored per data block.
void clear_trailing_bits()
Clear any partial rubbish in the last addressable block.
const unsigned int * cdata() const noexcept
A const pointer to the raw storage.
void transfer(PackedList< Width > &rhs)
Transfer the contents of the argument list into this list and annul the argument list.
bool trim(label minpos=-1)
Trim any trailing zero elements, optionally specifying a a minimum position, below which trimming wil...
label capacity() const noexcept
The number of elements that can be stored with reallocating.
unsigned int get(const label i) const
Get value at index i or 0 for out-of-range.
void shrink()
Shrink the allocated space to what is actually used.
reference(PackedList *parent, const label index)
Construct by taking reference of block from within the list and the specified index.
bool readBool(Istream &is)
Read bool from stream using Foam::Switch(Istream&)
void checkIndex(const label i) const
Check index is within valid range [0,size)
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...
void pop_back(label n=1)
Reduce size by 1 or more elements. Can be called on an empty list.