@@ -86,11 +86,6 @@ class any {
86 return std::make_shared<T>(std::move(arg));
86 return std::make_shared<T>(std::move(arg));
89− template <typename T, typename U>
90− static constexpr auto static_cast_shared(U arg) -> T* {
91− return static_cast<T*>(arg.get());
96 mutable long i;
91 mutable long i;
@@ -111,55 +106,30 @@ class any {
111 any(const long val) : type(Type::Integer), i(val) {}
106 any(const long val) : type(Type::Integer), i(val) {}
112 any(const int val) : type(Type::Integer), i(val) {}
107 any(const int val) : type(Type::Integer), i(val) {}
113 any(const unsigned int val) : type(Type::Integer), i(val) {}
108 any(const unsigned int val) : type(Type::Integer), i(val) {}
115 any(const double val) : type(Type::Double), d(val) {}
109 any(const double val) : type(Type::Double), d(val) {}
117 any(const char val) : type(Type::Character), c(val) {}
110 any(const char val) : type(Type::Character), c(val) {}
112+ template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
119− any(const bool val) : type(Type::Boolean), b(val) {}
113+ any(const T val) : type(Type::Boolean), b(val) {}
121 any(const string& val) : type(Type::String), s(make_shared<string>(val)) {}
115 any(const string& val) : type(Type::String), s(make_shared<string>(val)) {}
122 any(string&& val) : type(Type::String), s(make_shared<string>(std::move(val))) {}
116 any(string&& val) : type(Type::String), s(make_shared<string>(std::move(val))) {}
124 any(const char val[]) : type(Type::String), s(make_shared<string>(val)) {}
117 any(const char val[]) : type(Type::String), s(make_shared<string>(val)) {}
126− any(const shared<string>& val) : type(Type::String), s(val) {}
127− any(shared<string>&& val) : type(Type::String), s(std::move(val)) {}
129 any(const map& val) : type(Type::Map), m(make_shared<map>(val)) {}
119 any(const map& val) : type(Type::Map), m(make_shared<map>(val)) {}
130 any(map&& val) : type(Type::Map), m(make_shared<map>(std::move(val))) {}
120 any(map&& val) : type(Type::Map), m(make_shared<map>(std::move(val))) {}
132− any(const shared<map>& val) : type(Type::Map), m(val) {}
133− any(shared<map>&& val) : type(Type::Map), m(std::move(val)) {}
135 any(const vector& val) : type(Type::Vector), v(make_shared<vector>(val)) {}
122 any(const vector& val) : type(Type::Vector), v(make_shared<vector>(val)) {}
136 any(vector&& val) : type(Type::Vector), v(make_shared<vector>(std::move(val))) {}
123 any(vector&& val) : type(Type::Vector), v(make_shared<vector>(std::move(val))) {}
138− any(const shared<vector>& val) : type(Type::Vector), v(val) {}
139− any(shared<vector>&& val) : type(Type::Vector), v(std::move(val)) {}
141− any(const shared<fn>& val) : type(Type::Function), f(val) {}
142− any(shared<fn>&& val) : type(Type::Function), f(std::move(val)) {}
144− template <typename T,
145− typename = typename std::enable_if<!std::is_same<any,T>::value>::type>
125+ template <typename T, typename = typename std::enable_if<!std::is_same<any,T>::value>::type>
146 any(const T& val, typename std::enable_if<std::is_assignable<fn,T>::value>::type* = 0)
126 any(const T& val, typename std::enable_if<std::is_assignable<fn,T>::value>::type* = 0)
147 : type(Type::Function), f(make_shared<fn>(val)) {}
127 : type(Type::Function), f(make_shared<fn>(val)) {}
149− // template <typename T>
150− // any(T&& val, typename std::enable_if<std::is_assignable<fn,T>::value>::type* = 0)
151− // : type(Type::Function), f(std::move(val)) {}
153− any(const shared<eff_fn>& val) : type(Type::EffFunction), e(val) {}
154− any(shared<eff_fn>&& val) : type(Type::EffFunction), e(std::move(val)) {}
156 template <typename T>
129 template <typename T>
157 any(const T& val, typename std::enable_if<std::is_assignable<eff_fn,T>::value>::type* = 0)
130 any(const T& val, typename std::enable_if<std::is_assignable<eff_fn,T>::value>::type* = 0)
158 : type(Type::EffFunction), e(make_shared<eff_fn>(val)) {}
131 : type(Type::EffFunction), e(make_shared<eff_fn>(val)) {}
160− any(const shared<thunk>& val) : type(Type::Thunk), t(val) {}
161− any(shared<thunk>&& val) : type(Type::Thunk), t(std::move(val)) {}
163 template <typename T>
133 template <typename T>
164 any(const T& val, typename std::enable_if<std::is_assignable<thunk,T>::value>::type* = 0)
134 any(const T& val, typename std::enable_if<std::is_assignable<thunk,T>::value>::type* = 0)
165 : type(Type::Thunk), t(make_shared<thunk>(val)) {}
135 : type(Type::Thunk), t(make_shared<thunk>(val)) {}
@@ -168,12 +138,12 @@ class any {
168 any(const T& val, typename std::enable_if<std::is_assignable<shared<void>,T>::value>::type* = 0)
138 any(const T& val, typename std::enable_if<std::is_assignable<shared<void>,T>::value>::type* = 0)
169 : type(Type::Pointer), p(val) {}
139 : type(Type::Pointer), p(val) {}
171− any(std::nullptr_t) : type(Type::Pointer), p(nullptr) {}
173 template <typename T>
141 template <typename T>
174 any(T&& val, typename std::enable_if<std::is_assignable<shared<void>,T>::value>::type* = 0)
142 any(T&& val, typename std::enable_if<std::is_assignable<shared<void>,T>::value>::type* = 0)
175 : type(Type::Pointer), p(std::move(val)) {}
143 : type(Type::Pointer), p(std::move(val)) {}
145+ any(std::nullptr_t) : type(Type::Pointer), p(nullptr) {}
177 any(const any&);
147 any(const any&);
178 any(any&&);
148 any(any&&);
@@ -210,19 +180,7 @@ class any {
211 template <typename T>
181 template <typename T>
212 auto cast() const -> typename std::enable_if<std::is_assignable<shared<void>,T>::value, typename T::element_type*>::type {
182 auto cast() const -> typename std::enable_if<std::is_assignable<shared<void>,T>::value, typename T::element_type*>::type {
213− if (type == Type::Pointer) {
214− return static_cast_shared<typename T::element_type>(p);
183+ return static_cast<typename T::element_type*>(extractPointer());
216− const any* valuePtr = this;
218− assert(valuePtr->type == Type::Thunk);
219− const any& value = (*valuePtr->t)(unthunk);
220− if (value.type == Type::Pointer) {
221− return static_cast_shared<typename T::element_type>(value.p);
224− } while (valuePtr->type != Type::Unknown);
228 auto operator()(const any&) const -> any;
186 auto operator()(const any&) const -> any;
@@ -243,7 +201,7 @@ class any {
243 auto operator[](const vector::size_type) const -> const any&;
201 auto operator[](const vector::size_type) const -> const any&;
244 auto operator[](const any&) const -> const any&;
202 auto operator[](const any&) const -> const any&;
246− auto extractPointer() const -> const void*;
204+ auto extractPointer() const -> void*;
248 static auto extract_value(const any&) -> const any&;
206 static auto extract_value(const any&) -> const any&;