Advertisement
DNKpp

godot::Vector

Jul 31st, 2022 (edited)
1,213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.79 KB | None | 0 0
  1. #ifndef VECTOR_H
  2. #define VECTOR_H
  3.  
  4. /**
  5.  * @class Vector
  6.  * Vector container. Regular Vector Container. Use with care and for smaller arrays when possible. Use Vector for large arrays.
  7.  */
  8.  
  9. #include "core/error/error_macros.h"
  10. #include "core/templates/cowdata.h"
  11.  
  12. #include <algorithm>
  13. #include <initializer_list>
  14. #include <numeric>
  15.  
  16. template <class T>
  17. class Vector {
  18. public:
  19.     using Iterator = T *;
  20.     using ConstIterator = const T *;
  21.     using ReverseIterator = std::reverse_iterator<Iterator>;
  22.     using ConstReverseIterator = std::reverse_iterator<ConstIterator>;
  23.  
  24. private:
  25.     CowData<T> _cowdata;
  26.  
  27.     template <class Begin, class End>
  28.     _NO_DISCARD_ static int _find(const Begin beginIter, const End endIter, const T &p_value) {
  29.         const auto iter = std::find(beginIter, endIter, p_value);
  30.         return iter == endIter ? -1 : static_cast<int>(std::distance(beginIter, iter));
  31.     }
  32.  
  33. public:
  34.     Vector() = default;
  35.  
  36.     explicit Vector(const int p_size) {
  37.         _cowdata.resize(p_size);
  38.     }
  39.  
  40.     Vector(const int p_size, const T &p_value) :
  41.         Vector(p_size) {
  42.         fill(p_value);
  43.     }
  44.  
  45.     Vector(std::initializer_list<T> p_init) {
  46.         const Error err = _cowdata.resize(p_init.size());
  47.         ERR_FAIL_COND(err);
  48.  
  49.         std::copy(std::begin(p_init), std::end(p_init), begin());
  50.     }
  51.  
  52.     Vector(Vector &p_from) :
  53.         _cowdata{ p_from._cowdata } {
  54.     }
  55.  
  56.     Vector(const Vector &p_from) = delete;
  57.  
  58.     Vector &operator=(Vector &p_from) {
  59.         _cowdata = p_from._cowdata;
  60.         return *this;
  61.     }
  62.     Vector &operator=(const Vector &p_from) = delete;
  63.  
  64.     ~Vector() = default;
  65.  
  66.     _NO_DISCARD_ bool operator==(const Vector<T> &p_arr) const {
  67.         return std::equal(begin(), end(), p_arr.begin(), p_arr.end());
  68.     }
  69.  
  70.     _NO_DISCARD_ bool operator!=(const Vector<T> &p_arr) const {
  71.         return !(*this == p_arr);
  72.     }
  73.  
  74.     _NO_DISCARD_ Vector<T> duplicate() {
  75.         return *this;
  76.     }
  77.  
  78.     _NO_DISCARD_ Iterator begin() { return _cowdata.ptrw(); }
  79.     _NO_DISCARD_ Iterator end() { return _cowdata.ptrw() + _cowdata.size(); }
  80.     _NO_DISCARD_ ConstIterator begin() const { return _cowdata.ptr(); }
  81.     _NO_DISCARD_ ConstIterator end() const { return _cowdata.ptr() + _cowdata.size(); }
  82.     _NO_DISCARD_ ConstIterator cbegin() const { return begin(); }
  83.     _NO_DISCARD_ ConstIterator cend() const { return end(); }
  84.     _NO_DISCARD_ ReverseIterator rbegin() { return std::reverse_iterator{ end() }; }
  85.     _NO_DISCARD_ ReverseIterator rend() { return std::reverse_iterator{ begin() }; }
  86.     _NO_DISCARD_ ConstReverseIterator rbegin() const { return std::reverse_iterator{ end() }; }
  87.     _NO_DISCARD_ ConstReverseIterator rend() const { return std::reverse_iterator{ begin() }; }
  88.     _NO_DISCARD_ ConstReverseIterator crbegin() const { return rbegin(); }
  89.     _NO_DISCARD_ ConstReverseIterator crend() const { return rend(); }
  90.  
  91.     _NO_DISCARD_ T *ptrw() { return _cowdata.ptrw(); }
  92.  
  93.     _NO_DISCARD_ const T *ptr() const { return _cowdata.ptr(); }
  94.  
  95.     _NO_DISCARD_ const T &get(const int p_index) const {
  96.         return _cowdata.get(p_index);
  97.     }
  98.  
  99.     _NO_DISCARD_ void set(const int p_index, const T &p_elem) {
  100.         _cowdata.set(p_index, p_elem);
  101.     }
  102.  
  103.     _NO_DISCARD_ int size() const {
  104.         return _cowdata.size();
  105.     }
  106.  
  107.     _NO_DISCARD_ bool is_empty() const {
  108.         return _cowdata.is_empty();
  109.     }
  110.  
  111.     bool append(const T &p_elem) {
  112.         const Error err = resize(size() + 1);
  113.         ERR_FAIL_COND_V(err, true);
  114.         set(size() - 1, p_elem);
  115.  
  116.         return false;
  117.     }
  118.  
  119.     bool append(Vector<T> p_other) {
  120.         const int ds = p_other.size();
  121.         if (ds == 0) {
  122.             return;
  123.         }
  124.         const int bs = size();
  125.         resize(bs + ds);
  126.         if (p_other._cowdata._get_refcount()->get() == 1) {
  127.             std::move(p_other.begin(), p_other.end(), begin() + bs);
  128.         } else {
  129.             std::copy(p_other.cbegin(), p_other.cend(), begin() + bs);
  130.         }
  131.     }
  132.  
  133.     Error insert(const int p_pos, const T &p_val) {
  134.         return _cowdata.insert(p_pos, p_val);
  135.     }
  136.  
  137.     void ordered_insert(const T &p_val) {
  138.         const auto iter = std::find_if(begin(), end(), [&](const T &p_other) { return p_val < p_other; });
  139.         insert(static_cast<int>(std::distance(begin(), iter)), p_val);
  140.     }
  141.  
  142.     void remove_at(const int p_index) {
  143.         _cowdata.remove_at(p_index);
  144.     }
  145.  
  146.     void erase(const T &p_val) {
  147.         const ConstIterator beginIter = cbegin();
  148.         const ConstIterator endIter = cend();
  149.         const auto iter = std::find(beginIter, endIter, p_val);
  150.         if (iter != endIter) {
  151.             remove_at(static_cast<int>(std::distance(beginIter, iter)));
  152.         }
  153.     }
  154.  
  155.     void clear() {
  156.         _cowdata.resize(0);
  157.     }
  158.  
  159.     Error resize(const int p_size) {
  160.         return _cowdata.resize(p_size);
  161.     }
  162.  
  163.     void fill(const T &p_elem) {
  164.         std::fill(begin(), end(), p_elem);
  165.     }
  166.  
  167.     void reverse() {
  168.         std::reverse(begin(), end());
  169.     }
  170.  
  171.     _NO_DISCARD_ int find(const T &p_value, const int p_from = 0) const {
  172.         return _find(begin() + p_from, end(), p_value);
  173.     }
  174.  
  175.     _NO_DISCARD_ int rfind(const T &p_value, const int p_from = 0) const {
  176.         return _find(rbegin() + p_from, rend(), p_value);
  177.     }
  178.  
  179.     _NO_DISCARD_ int count(const T &p_val) const {
  180.         return std::count(begin(), end(), p_val);
  181.     }
  182.  
  183.     _NO_DISCARD_ bool has(const T &p_value) const {
  184.         const auto endItr = end();
  185.         return std::find(begin(), endItr, p_value) != endItr;
  186.     }
  187.  
  188.     void sort() {
  189.         sort_custom<std::less<>>();
  190.     }
  191.  
  192.     template <class Comparator, class... Args>
  193.     void sort_custom(Args &&...args) {
  194.         std::sort(begin(), end(), Comparator{ std::forward<Args>(args)... });
  195.     }
  196.  
  197.     _NO_DISCARD_ int bsearch(const T &p_value, bool p_before) const {
  198.         return bsearch_custom<std::less<>>(p_value, p_before);
  199.     }
  200.  
  201.     template <class Comparator, class Value, class... Args>
  202.     _NO_DISCARD_ int bsearch_custom(const Value &p_value, bool p_before, Args &&...args) const {
  203.         const ConstIterator beginIter = begin();
  204.         const ConstIterator endIter = end();
  205.         const ConstIterator iter = p_before
  206.                 ? std::lower_bound(beginIter, endIter, p_value, Comparator{ std::forward<Args>(args)... })
  207.                 : std::upper_bound(beginIter, endIter, p_value, Comparator{ std::forward<Args>(args)... });
  208.         return iter == endIter ? -1 : static_cast<int>(std::distance(beginIter, iter));
  209.     }
  210.  
  211.     _NO_DISCARD_ Vector<uint8_t> to_byte_array() const {
  212.         if (is_empty()) {
  213.             return {};
  214.         }
  215.         const int ret_size = size() * sizeof(T);
  216.         Vector<uint8_t> ret(ret_size);
  217.         memcpy(ret.ptrw(), ptr(), ret_size);
  218.         return ret;
  219.     }
  220.  
  221.     _NO_DISCARD_ Vector<T> slice(const int p_begin, const int p_end = std::numeric_limits<int>::max()) const {
  222.         const int s = size();
  223.  
  224.         int begin_index = CLAMP(p_begin, -s, s);
  225.         if (begin_index < 0) {
  226.             begin_index += s;
  227.         }
  228.         int end_index = CLAMP(p_end, -s, s);
  229.         if (end_index < 0) {
  230.             end_index += s;
  231.         }
  232.  
  233.         Vector<T> result;
  234.         ERR_FAIL_COND_V(begin_index > end_index, result);
  235.  
  236.         const int result_size = end_index - begin_index;
  237.         result.resize(result_size);
  238.  
  239.         const ConstIterator beginIter = begin() + begin_index;
  240.         std::copy(beginIter,beginIter + result_size,result.begin());
  241.  
  242.         return result;
  243.     }
  244. };
  245.  
  246. #endif // VECTOR_H
  247.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement