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.
5 #ifndef OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP
6 #define OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP
13 namespace cv { namespace dnn { namespace cuda4dnn { namespace cxx_utils {
15 template <class T, std::size_t maxN>
16 class resizable_static_array {
17 using container_type = std::array<T, maxN>;
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;
32 resizable_static_array() noexcept : size_{ 0 } { }
33 explicit resizable_static_array(size_type sz) noexcept : size_{ sz } { }
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; }
39 void resize(size_type sz) noexcept {
40 assert(sz <= capacity());
44 void clear() noexcept { size_ = 0; }
46 template <class ForwardItr>
47 void assign(ForwardItr first, ForwardItr last) {
48 resize(std::distance(first, last));
49 std::copy(first, last, begin());
52 iterator begin() noexcept { return std::begin(arr); }
53 iterator end() noexcept { return std::begin(arr) + size(); }
55 const_iterator begin() const noexcept { return arr.cbegin(); }
56 const_iterator end() const noexcept { return arr.cbegin() + size(); }
58 const_iterator cbegin() const noexcept { return arr.cbegin(); }
59 const_iterator cend() const noexcept { return arr.cbegin() + size(); }
61 reverse_iterator rbegin() noexcept { return std::begin(arr) + size(); }
62 reverse_iterator rend() noexcept { return std::begin(arr); }
64 const_reverse_iterator rbegin() const noexcept { return arr.cbegin()+ size(); }
65 const_reverse_iterator rend() const noexcept { return arr.cbegin(); }
67 const_reverse_iterator crbegin() const noexcept { return arr.cbegin() + size(); }
68 const_reverse_iterator crend() const noexcept { return arr.cbegin(); }
70 reference operator[](size_type pos) {
75 const_reference operator[](size_type pos) const {
80 iterator insert(iterator pos, const T& value) {
82 std::move_backward(pos, end() - 1, end());
87 iterator insert(iterator pos, T&& value) {
89 std::move_backward(pos, end() - 1, end());
90 *pos = std::move(value);
94 iterator erase(iterator pos) {
95 std::move(pos + 1, end(), pos);
100 pointer data() noexcept { return arr.data(); }
101 const_pointer data() const noexcept { return arr.data(); }
108 }}}} /* namespace cv::dnn::cuda4dnn::csl::cxx_utils */
110 #endif /* OPENCV_DNN_SRC_CUDA4DNN_CXX_UTILS_RESIZABLE_STATIC_ARRAY_HPP */