xref: /aosp_15_r20/external/armnn/third-party/mapbox/recursive_wrapper.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright (c) MapBox All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: BSD-3-Clause
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
7*89c4ff92SAndroid Build Coastguard Worker #define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker // Based on variant/recursive_wrapper.hpp from boost.
10*89c4ff92SAndroid Build Coastguard Worker //
11*89c4ff92SAndroid Build Coastguard Worker // Original license:
12*89c4ff92SAndroid Build Coastguard Worker //
13*89c4ff92SAndroid Build Coastguard Worker // Copyright (c) 2002-2003
14*89c4ff92SAndroid Build Coastguard Worker // Eric Friedman, Itay Maman
15*89c4ff92SAndroid Build Coastguard Worker //
16*89c4ff92SAndroid Build Coastguard Worker // Distributed under the Boost Software License, Version 1.0. (See
17*89c4ff92SAndroid Build Coastguard Worker // accompanying file LICENSE_1_0.txt or copy at
18*89c4ff92SAndroid Build Coastguard Worker // http://www.boost.org/LICENSE_1_0.txt)
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker #include <cassert>
21*89c4ff92SAndroid Build Coastguard Worker #include <utility>
22*89c4ff92SAndroid Build Coastguard Worker 
23*89c4ff92SAndroid Build Coastguard Worker namespace mapbox {
24*89c4ff92SAndroid Build Coastguard Worker namespace util {
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker template <typename T>
27*89c4ff92SAndroid Build Coastguard Worker class recursive_wrapper
28*89c4ff92SAndroid Build Coastguard Worker {
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker     T* p_;
31*89c4ff92SAndroid Build Coastguard Worker 
assign(T const & rhs)32*89c4ff92SAndroid Build Coastguard Worker     void assign(T const& rhs)
33*89c4ff92SAndroid Build Coastguard Worker     {
34*89c4ff92SAndroid Build Coastguard Worker         this->get() = rhs;
35*89c4ff92SAndroid Build Coastguard Worker     }
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker public:
38*89c4ff92SAndroid Build Coastguard Worker     using type = T;
39*89c4ff92SAndroid Build Coastguard Worker 
40*89c4ff92SAndroid Build Coastguard Worker     /**
41*89c4ff92SAndroid Build Coastguard Worker      * Default constructor default initializes the internally stored value.
42*89c4ff92SAndroid Build Coastguard Worker      * For POD types this means nothing is done and the storage is
43*89c4ff92SAndroid Build Coastguard Worker      * uninitialized.
44*89c4ff92SAndroid Build Coastguard Worker      *
45*89c4ff92SAndroid Build Coastguard Worker      * @throws std::bad_alloc if there is insufficient memory for an object
46*89c4ff92SAndroid Build Coastguard Worker      *         of type T.
47*89c4ff92SAndroid Build Coastguard Worker      * @throws any exception thrown by the default constructur of T.
48*89c4ff92SAndroid Build Coastguard Worker      */
recursive_wrapper()49*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper()
50*89c4ff92SAndroid Build Coastguard Worker         : p_(new T){}
51*89c4ff92SAndroid Build Coastguard Worker 
~recursive_wrapper()52*89c4ff92SAndroid Build Coastguard Worker     ~recursive_wrapper() noexcept { delete p_; }
53*89c4ff92SAndroid Build Coastguard Worker 
recursive_wrapper(recursive_wrapper const & operand)54*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper(recursive_wrapper const& operand)
55*89c4ff92SAndroid Build Coastguard Worker         : p_(new T(operand.get())) {}
56*89c4ff92SAndroid Build Coastguard Worker 
recursive_wrapper(T const & operand)57*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper(T const& operand)
58*89c4ff92SAndroid Build Coastguard Worker         : p_(new T(operand)) {}
59*89c4ff92SAndroid Build Coastguard Worker 
recursive_wrapper(recursive_wrapper && operand)60*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper(recursive_wrapper&& operand)
61*89c4ff92SAndroid Build Coastguard Worker         : p_(new T(std::move(operand.get()))) {}
62*89c4ff92SAndroid Build Coastguard Worker 
recursive_wrapper(T && operand)63*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper(T&& operand)
64*89c4ff92SAndroid Build Coastguard Worker         : p_(new T(std::move(operand))) {}
65*89c4ff92SAndroid Build Coastguard Worker 
operator =(recursive_wrapper const & rhs)66*89c4ff92SAndroid Build Coastguard Worker     inline recursive_wrapper& operator=(recursive_wrapper const& rhs)
67*89c4ff92SAndroid Build Coastguard Worker     {
68*89c4ff92SAndroid Build Coastguard Worker         assign(rhs.get());
69*89c4ff92SAndroid Build Coastguard Worker         return *this;
70*89c4ff92SAndroid Build Coastguard Worker     }
71*89c4ff92SAndroid Build Coastguard Worker 
operator =(T const & rhs)72*89c4ff92SAndroid Build Coastguard Worker     inline recursive_wrapper& operator=(T const& rhs)
73*89c4ff92SAndroid Build Coastguard Worker     {
74*89c4ff92SAndroid Build Coastguard Worker         assign(rhs);
75*89c4ff92SAndroid Build Coastguard Worker         return *this;
76*89c4ff92SAndroid Build Coastguard Worker     }
77*89c4ff92SAndroid Build Coastguard Worker 
swap(recursive_wrapper & operand)78*89c4ff92SAndroid Build Coastguard Worker     inline void swap(recursive_wrapper& operand) noexcept
79*89c4ff92SAndroid Build Coastguard Worker     {
80*89c4ff92SAndroid Build Coastguard Worker         T* temp = operand.p_;
81*89c4ff92SAndroid Build Coastguard Worker         operand.p_ = p_;
82*89c4ff92SAndroid Build Coastguard Worker         p_ = temp;
83*89c4ff92SAndroid Build Coastguard Worker     }
84*89c4ff92SAndroid Build Coastguard Worker 
operator =(recursive_wrapper && rhs)85*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
86*89c4ff92SAndroid Build Coastguard Worker     {
87*89c4ff92SAndroid Build Coastguard Worker         swap(rhs);
88*89c4ff92SAndroid Build Coastguard Worker         return *this;
89*89c4ff92SAndroid Build Coastguard Worker     }
90*89c4ff92SAndroid Build Coastguard Worker 
operator =(T && rhs)91*89c4ff92SAndroid Build Coastguard Worker     recursive_wrapper& operator=(T&& rhs)
92*89c4ff92SAndroid Build Coastguard Worker     {
93*89c4ff92SAndroid Build Coastguard Worker         get() = std::move(rhs);
94*89c4ff92SAndroid Build Coastguard Worker         return *this;
95*89c4ff92SAndroid Build Coastguard Worker     }
96*89c4ff92SAndroid Build Coastguard Worker 
get()97*89c4ff92SAndroid Build Coastguard Worker     T& get()
98*89c4ff92SAndroid Build Coastguard Worker     {
99*89c4ff92SAndroid Build Coastguard Worker         assert(p_);
100*89c4ff92SAndroid Build Coastguard Worker         return *get_pointer();
101*89c4ff92SAndroid Build Coastguard Worker     }
102*89c4ff92SAndroid Build Coastguard Worker 
get() const103*89c4ff92SAndroid Build Coastguard Worker     T const& get() const
104*89c4ff92SAndroid Build Coastguard Worker     {
105*89c4ff92SAndroid Build Coastguard Worker         assert(p_);
106*89c4ff92SAndroid Build Coastguard Worker         return *get_pointer();
107*89c4ff92SAndroid Build Coastguard Worker     }
108*89c4ff92SAndroid Build Coastguard Worker 
get_pointer()109*89c4ff92SAndroid Build Coastguard Worker     T* get_pointer() { return p_; }
110*89c4ff92SAndroid Build Coastguard Worker 
get_pointer() const111*89c4ff92SAndroid Build Coastguard Worker     const T* get_pointer() const { return p_; }
112*89c4ff92SAndroid Build Coastguard Worker 
operator T const&() const113*89c4ff92SAndroid Build Coastguard Worker     operator T const&() const { return this->get(); }
114*89c4ff92SAndroid Build Coastguard Worker 
operator T&()115*89c4ff92SAndroid Build Coastguard Worker     operator T&() { return this->get(); }
116*89c4ff92SAndroid Build Coastguard Worker 
117*89c4ff92SAndroid Build Coastguard Worker }; // class recursive_wrapper
118*89c4ff92SAndroid Build Coastguard Worker 
119*89c4ff92SAndroid Build Coastguard Worker template <typename T>
swap(recursive_wrapper<T> & lhs,recursive_wrapper<T> & rhs)120*89c4ff92SAndroid Build Coastguard Worker inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
121*89c4ff92SAndroid Build Coastguard Worker {
122*89c4ff92SAndroid Build Coastguard Worker     lhs.swap(rhs);
123*89c4ff92SAndroid Build Coastguard Worker }
124*89c4ff92SAndroid Build Coastguard Worker } // namespace util
125*89c4ff92SAndroid Build Coastguard Worker } // namespace mapbox
126*89c4ff92SAndroid Build Coastguard Worker 
127*89c4ff92SAndroid Build Coastguard Worker #endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
128