BLI: add high level documentation for core data structures #25

Merged
Jacques Lucke merged 14 commits from JacquesLucke/blender-developer-docs:core-data-structures into main 2024-02-19 19:09:34 +01:00
Showing only changes of commit da0a219b62 - Show all commits

View File

@ -1 +1,58 @@
# Any
`blender::Any` ([source](https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenlib/BLI_any.hh)) is a type-safe container for single values of any copy-constructible type. It is similar to `std::any` but provides the following two additional features:
- It has adjustable inline buffer capacity and alignment. `std::any` typically has a small inline buffer but its size is not guaranteed.
- It can store additional user-defined type information without increasing the `sizeof` the `Any` object.
If any of those features is required, it's benefitial to use `blender::Any`. Otherwise using `std::any` is fine as well.
```cpp
/* Construct empty value. */
Any<> value;
/* Check if there is any value inside. */
bool contains_value = value.has_value();
/* Assign values of different types. Each assignment overwrites the previous one. */
value = 4;
value = "four";
value = 4.0f;
/* Check if a specific type is stored. */
bool is_type = value.is<float>();
/* Access the value with a specific type. */
/* This only works if the stored value actually has the given type. */
float value = value.get<float>();
/* Get a pointer to the value without knowing the type. */
void *value = value.get();
/* Remove the value if there is any. */
value.reset();
```
## Store Additional Type Information
One of the features of `blender::Any` is that it can store additional information for each type that is stored. This can be done with fairly low overhead, because `Any` does type erasure and has to store some type specific information anyway.
In the example below, the `blender::Any` knows the size of the stored type.
```cpp
/* Struct that contains all the information that should be stored for the type. */
struct ExtraSizeInfo {
size_t size;
/* Function that constructs the extra info for a given type. */
template<typename T> static constexpr ExtraSizeInfo get()
{
return {sizeof(T)};
}
};
/* Construct the Any with the integer 5 stored in it. */
Any<ExtraSizeInfo> value = 5;
/* Access the size of the stored type. */
int stored_size = value.extra_info().size; /* = 4 */
```