]> git.sesse.net Git - casparcg/blob - common/memory/array.h
22aeb3d18839dfd7dd88382631d8ad108725c224
[casparcg] / common / memory / array.h
1 #pragma once\r
2 \r
3 #include "../spl/memory.h"\r
4 #include "../forward.h"\r
5 \r
6 #include <boost/any.hpp>\r
7 \r
8 #include <cstddef>\r
9 #include <cstdint>\r
10 \r
11 FORWARD1(boost, template<typename> class shared_future);\r
12 \r
13 namespace caspar { namespace core {\r
14         \r
15 class mutable_array\r
16 {\r
17         mutable_array(const mutable_array&);\r
18         mutable_array& operator=(const mutable_array&);\r
19 \r
20         friend class const_array;\r
21 public:\r
22 \r
23         // Static Members\r
24 \r
25         // Constructors\r
26         \r
27         template<typename T>\r
28         explicit mutable_array(std::uint8_t* ptr, std::size_t size, T&& storage)\r
29                 : ptr_(ptr)\r
30                 , size_(size)\r
31                 , storage_(new boost::any(std::forward<T>(storage)))\r
32         {\r
33         }\r
34 \r
35         mutable_array(mutable_array&& other);\r
36 \r
37         // Methods\r
38 \r
39         mutable_array& operator=(mutable_array&& other);\r
40 \r
41         // Properties\r
42         \r
43         std::uint8_t* begin();\r
44         std::uint8_t* data();\r
45         std::uint8_t* end();\r
46         const std::uint8_t* begin() const;\r
47         const std::uint8_t* data() const;\r
48         const std::uint8_t* end() const;\r
49         std::size_t size() const;\r
50         bool empty() const;\r
51         \r
52         template<typename T>\r
53         T storage() const\r
54         {\r
55                 return boost::any_cast<T>(*storage_);\r
56         }\r
57 private:\r
58         std::uint8_t*   ptr_;\r
59         std::size_t             size_;\r
60         std::unique_ptr<boost::any>     storage_;\r
61 };\r
62 \r
63 class const_array\r
64 {\r
65 public:\r
66 \r
67         // Static Members\r
68 \r
69         // Constructors\r
70 \r
71         template<typename T>\r
72         explicit const_array(const std::uint8_t* ptr, std::size_t size, T&& storage)\r
73                 : ptr_(ptr)\r
74                 , size_(size)\r
75                 , storage_(new boost::any(std::forward<T>(storage)))\r
76         {\r
77         }\r
78         \r
79         const_array(const const_array& other);  \r
80         const_array(mutable_array&& other);\r
81 \r
82         // Methods\r
83 \r
84         const_array& operator=(const const_array& other);\r
85         void swap(const_array& other);\r
86 \r
87         // Properties\r
88                 \r
89         const std::uint8_t* begin() const;\r
90         const std::uint8_t* data() const;\r
91         const std::uint8_t* end() const;\r
92         std::size_t size() const;\r
93         bool empty() const;\r
94 \r
95         template<typename T>\r
96         T storage() const\r
97         {\r
98                 return boost::any_cast<T>(*storage_);\r
99         }\r
100 \r
101 private:\r
102         const std::uint8_t*     ptr_;\r
103         std::size_t                     size_;\r
104         std::shared_ptr<boost::any>     storage_;\r
105 };\r
106 \r
107 }}