diff options
author | Jacques Lucke <jacques@blender.org> | 2020-07-08 23:27:25 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-07-08 23:27:25 +0300 |
commit | 403384998a6bb5f428e15ced5503206b45032b25 (patch) | |
tree | 23e09b183faa196603aafb1572ed0f13b3964333 /source/blender/blenlib/BLI_array.hh | |
parent | 4b85ed819dc0746f6fc46eab1019aab4c4fcf9c9 (diff) |
BLI: improve constructors and conversions to span
This allows us to avoid many calls to `as_span()` methods. I will
remove those in the next commit. Furthermore, constructors
of Vector and Array can convert from one type to another now.
I tested these changes on Linux with gcc and on Windows.
Diffstat (limited to 'source/blender/blenlib/BLI_array.hh')
-rw-r--r-- | source/blender/blenlib/BLI_array.hh | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/source/blender/blenlib/BLI_array.hh b/source/blender/blenlib/BLI_array.hh index 18f9aad1000..c7a9c49c972 100644 --- a/source/blender/blenlib/BLI_array.hh +++ b/source/blender/blenlib/BLI_array.hh @@ -89,17 +89,19 @@ class Array { /** * Create a new array that contains copies of all values. */ - Array(Span<T> values, Allocator allocator = {}) : allocator_(allocator) + template<typename U, typename std::enable_if_t<std::is_convertible_v<U, T>> * = nullptr> + Array(Span<U> values, Allocator allocator = {}) : allocator_(allocator) { size_ = values.size(); data_ = this->get_buffer_for_size(values.size()); - uninitialized_copy_n(values.data(), size_, data_); + uninitialized_convert_n<U, T>(values.data(), size_, data_); } /** * Create a new array that contains copies of all values. */ - Array(const std::initializer_list<T> &values) : Array(Span<T>(values)) + template<typename U, typename std::enable_if_t<std::is_convertible_v<U, T>> * = nullptr> + Array(const std::initializer_list<U> &values) : Array(Span<U>(values)) { } @@ -219,6 +221,18 @@ class Array { return MutableSpan<T>(data_, size_); } + template<typename U, typename std::enable_if_t<is_convertible_pointer_v<T, U>> * = nullptr> + operator Span<U>() const + { + return Span<U>(data_, size_); + } + + template<typename U, typename std::enable_if_t<is_convertible_pointer_v<T, U>> * = nullptr> + operator MutableSpan<U>() + { + return MutableSpan<U>(data_, size_); + } + Span<T> as_span() const { return *this; |