Skip to content

Commit f1c1274

Browse files
committedMay 8, 2014
recursive_wrapper init impl
1 parent b41b4f6 commit f1c1274

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed
 

‎Jamroot

+12
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,15 @@ exe binary-visitor-test
2828
<define>VARIANT_LOGICAL_TESTS
2929
<variant>release:<cxxflags>-march=native
3030
;
31+
32+
exe recursive-wrapper-test
33+
:
34+
recursive_wrapper_test.cpp
35+
.//system
36+
.//timer
37+
.//chrono
38+
:
39+
<include>$(BOOST_DIR)/include
40+
<define>VARIANT_LOGICAL_TESTS
41+
<variant>release:<cxxflags>-march=native
42+
;

‎recursive_wrapper.hpp

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
#ifndef UTIL_VARIANT_RECURSIVE_WRAPPER_HPP
2+
#define UTIL_VARIANT_RECURSIVE_WRAPPER_HPP
3+
4+
5+
namespace util {
6+
7+
template <typename T>
8+
class recursive_wrapper
9+
{
10+
public:
11+
12+
typedef T type;
13+
14+
private:
15+
16+
T* p_;
17+
18+
public:
19+
20+
~recursive_wrapper();
21+
recursive_wrapper();
22+
23+
recursive_wrapper(recursive_wrapper const& operand);
24+
recursive_wrapper(T const& operand);
25+
recursive_wrapper(recursive_wrapper&& operand);
26+
recursive_wrapper(T&& operand);
27+
28+
private:
29+
30+
void assign(const T& rhs);
31+
32+
public:
33+
34+
recursive_wrapper& operator=(const recursive_wrapper& rhs)
35+
{
36+
assign( rhs.get() );
37+
return *this;
38+
}
39+
40+
recursive_wrapper& operator=(const T& rhs)
41+
{
42+
assign( rhs );
43+
return *this;
44+
}
45+
46+
void swap(recursive_wrapper& operand) noexcept
47+
{
48+
T* temp = operand.p_;
49+
operand.p_ = p_;
50+
p_ = temp;
51+
}
52+
53+
54+
recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
55+
{
56+
swap(rhs);
57+
return *this;
58+
}
59+
60+
recursive_wrapper& operator=(T&& rhs)
61+
{
62+
get() = std::move(rhs);
63+
return *this;
64+
}
65+
66+
67+
public:
68+
69+
T& get() { return *get_pointer(); }
70+
const T& get() const { return *get_pointer(); }
71+
72+
T* get_pointer() { return p_; }
73+
const T* get_pointer() const { return p_; }
74+
75+
};
76+
77+
template <typename T>
78+
recursive_wrapper<T>::~recursive_wrapper()
79+
{
80+
boost::checked_delete(p_);
81+
}
82+
83+
template <typename T>
84+
recursive_wrapper<T>::recursive_wrapper()
85+
: p_(new T)
86+
{
87+
}
88+
89+
template <typename T>
90+
recursive_wrapper<T>::recursive_wrapper(recursive_wrapper const& operand)
91+
: p_(new T( operand.get() ))
92+
{
93+
}
94+
95+
template <typename T>
96+
recursive_wrapper<T>::recursive_wrapper(T const& operand)
97+
: p_(new T(operand))
98+
{
99+
}
100+
101+
template <typename T>
102+
recursive_wrapper<T>::recursive_wrapper(recursive_wrapper&& operand)
103+
: p_(new T( std::move(operand.get()) ))
104+
{
105+
}
106+
107+
template <typename T>
108+
recursive_wrapper<T>::recursive_wrapper(T&& operand)
109+
: p_(new T( std::move(operand) ))
110+
{
111+
}
112+
113+
template <typename T>
114+
void recursive_wrapper<T>::assign(const T& rhs)
115+
{
116+
this->get() = rhs;
117+
}
118+
119+
template <typename T>
120+
inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
121+
{
122+
lhs.swap(rhs);
123+
}
124+
125+
}
126+
127+
#endif // UTIL_VARIANT_RECURSIVE_WRAPPER_HPP

0 commit comments

Comments
 (0)
Please sign in to comment.