Merge pull request #14827 from YashasSamaga:cuda4dnn-csl-low
[platform/upstream/opencv.git] / modules / dnn / src / cuda4dnn / cxx_utils / resizable_static_array.hpp
1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4
5 #ifndef OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP
6 #define OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP
7
8 #include <cstddef>
9 #include <array>
10 #include <cassert>
11 #include <algorithm>
12
13 namespace cv { namespace dnn { namespace cuda4dnn { namespace cxx_utils {
14
15     template <class T, std::size_t maxN>
16     class resizable_static_array {
17         using container_type = std::array<T, maxN>;
18
19     public:
20         using value_type                = typename container_type::value_type;
21         using size_type                 = typename container_type::size_type;
22         using difference_type           = typename container_type::difference_type;
23         using reference                 = typename container_type::reference;
24         using const_reference           = typename container_type::const_reference;
25         using pointer                   = typename container_type::pointer;
26         using const_pointer             = typename container_type::const_pointer;
27         using iterator                  = typename container_type::iterator;
28         using const_iterator            = typename container_type::const_iterator;
29         using reverse_iterator          = typename container_type::reverse_iterator;
30         using const_reverse_iterator    = typename container_type::const_reverse_iterator;
31
32         resizable_static_array() noexcept : size_{ 0 } { }
33         explicit resizable_static_array(size_type sz) noexcept : size_{ sz } { }
34
35         bool empty() const noexcept { return static_cast<bool>(size_); }
36         size_type size() const noexcept { return size_; }
37         size_type capacity() const noexcept { return maxN; }
38
39         void resize(size_type sz) noexcept {
40             assert(sz <= capacity());
41             size_ = sz;
42         }
43
44         void clear() noexcept { size_ = 0; }
45
46         template <class ForwardItr>
47         void assign(ForwardItr first, ForwardItr last) {
48             resize(std::distance(first, last));
49             std::copy(first, last, begin());
50         }
51
52         iterator begin() noexcept { return std::begin(arr); }
53         iterator end() noexcept { return std::begin(arr) + size(); }
54
55         const_iterator begin() const noexcept { return arr.cbegin(); }
56         const_iterator end() const noexcept { return arr.cbegin() + size(); }
57
58         const_iterator cbegin() const noexcept { return arr.cbegin(); }
59         const_iterator cend() const noexcept { return arr.cbegin() + size(); }
60
61         reverse_iterator rbegin() noexcept { return std::begin(arr) + size(); }
62         reverse_iterator rend() noexcept { return std::begin(arr); }
63
64         const_reverse_iterator rbegin() const noexcept { return arr.cbegin()+ size(); }
65         const_reverse_iterator rend() const noexcept { return arr.cbegin(); }
66
67         const_reverse_iterator crbegin() const noexcept { return arr.cbegin() + size(); }
68         const_reverse_iterator crend() const noexcept { return arr.cbegin(); }
69
70         reference operator[](size_type pos) {
71             assert(pos < size());
72             return arr[pos];
73         }
74
75         const_reference operator[](size_type pos) const {
76             assert(pos < size());
77             return arr[pos];
78         }
79
80         iterator insert(iterator pos, const T& value) {
81             resize(size() + 1);
82             std::move_backward(pos, end() - 1, end());
83             *pos = value;
84             return pos;
85         }
86
87         iterator insert(iterator pos, T&& value) {
88             resize(size() + 1);
89             std::move_backward(pos, end() - 1, end());
90             *pos = std::move(value);
91             return pos;
92         }
93
94         iterator erase(iterator pos) {
95             std::move(pos + 1, end(), pos);
96             resize(size() - 1);
97             return pos;
98         }
99
100         pointer data() noexcept { return arr.data(); }
101         const_pointer data() const noexcept { return arr.data(); }
102
103     private:
104         std::size_t size_;
105         container_type arr;
106     };
107
108 }}}} /* namespace cv::dnn::cuda4dnn::csl::cxx_utils */
109
110 #endif /* OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP */