diff options
Diffstat (limited to 'source/blender/blenlib/BLI_virtual_list_list_ref.h')
-rw-r--r-- | source/blender/blenlib/BLI_virtual_list_list_ref.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_virtual_list_list_ref.h b/source/blender/blenlib/BLI_virtual_list_list_ref.h new file mode 100644 index 00000000000..ebcda7eb438 --- /dev/null +++ b/source/blender/blenlib/BLI_virtual_list_list_ref.h @@ -0,0 +1,85 @@ +#ifndef __BLI_VIRTUAL_ARRAY_LIST_REF_H__ +#define __BLI_VIRTUAL_ARRAY_LIST_REF_H__ + +#include "BLI_virtual_list_ref.h" + +namespace BLI { + +template<typename T> class VirtualListListRef { + private: + enum Category { + SingleArray, + ListOfStartPointers, + }; + + uint m_virtual_size; + Category m_category; + + union { + struct { + const T *start; + uint size; + } single_array; + struct { + const T *const *starts; + const uint *sizes; + } list_of_start_pointers; + } m_data; + + public: + VirtualListListRef() + { + m_virtual_size = 0; + m_category = ListOfStartPointers; + m_data.list_of_start_pointers.starts = nullptr; + m_data.list_of_start_pointers.sizes = nullptr; + } + + static VirtualListListRef FromSingleArray(ArrayRef<T> array, uint virtual_list_size) + { + VirtualListListRef list; + list.m_virtual_size = virtual_list_size; + list.m_category = Category::SingleArray; + list.m_data.single_array.start = array.begin(); + list.m_data.single_array.size = array.size(); + return list; + } + + static VirtualListListRef FromListOfStartPointers(ArrayRef<const T *> starts, + ArrayRef<uint> sizes) + { + assert_same_size(starts, sizes); + VirtualListListRef list; + list.m_virtual_size = starts.size(); + list.m_category = Category::ListOfStartPointers; + list.m_data.list_of_start_pointers.starts = starts.begin(); + list.m_data.list_of_start_pointers.sizes = sizes.begin(); + return list; + } + + uint size() const + { + return m_virtual_size; + } + + VirtualListRef<T> operator[](uint index) const + { + BLI_assert(index < m_virtual_size); + + switch (m_category) { + case Category::SingleArray: + return VirtualListRef<T>::FromFullArray( + ArrayRef<T>(m_data.single_array.start, m_data.single_array.size)); + case Category::ListOfStartPointers: + return VirtualListRef<T>::FromFullArray(m_data.list_of_start_pointers.starts[index], + m_data.list_of_start_pointers.sizes[index]); + } + + BLI_assert(false); + return {}; + } +}; + +} // namespace BLI + +#endif /* __BLI_VIRTUAL_ARRAY_LIST_REF_H__ */ |