@@ -29,7 +29,6 @@
29#include <functional>
29#include <functional>
30#include <string>
30#include <string>
31#include <vector>
31#include <vector>
33#include <utility>
32#include <utility>
34#include <stdexcept>
33#include <stdexcept>
@@ -57,7 +56,7 @@ public:
59const bool undefined = false;
58const bool undefined = false;
60−const size_t kDataCtor = 0;
59+const std::vector<int>::size_type kDataCtor = 0;
62// A variant data class designed to provide some features of dynamic typing.
61// A variant data class designed to provide some features of dynamic typing.
@@ -74,7 +73,6 @@ class any {
80 EffFunction,
78 EffFunction,
@@ -82,22 +80,17 @@ class any {
86 mutable Type type = Type::Unknown;
83 mutable Type type = Type::Unknown;
87− using vector = std::vector<any>;
90 struct as_thunk {
85 struct as_thunk {
92 static constexpr as_thunk unthunk = as_thunk{};
87 static constexpr as_thunk unthunk = as_thunk{};
94 using map = std::vector<std::pair<const char * const, const any>>;
89 using map = std::vector<std::pair<const char * const, const any>>;
95− using data = vector;
90+ using vector = std::vector<any>;
96− using array = std::deque<any>;
97 using fn = auto (*)(const any&) -> any;
91 using fn = auto (*)(const any&) -> any;
98 using thunk = auto (*)(const as_thunk) -> const any&;
92 using thunk = auto (*)(const as_thunk) -> const any&;
101 class closure {
94 class closure {
103 virtual auto operator()(const any&) const -> any = 0;
96 virtual auto operator()(const any&) const -> any = 0;
@@ -128,7 +121,6 @@ class any {
132 template <typename T>
124 template <typename T>
133 using shared = std::shared_ptr<T>;
125 using shared = std::shared_ptr<T>;
@@ -147,7 +139,6 @@ class any {
147 mutable shared<std::string> s;
139 mutable shared<std::string> s;
148 mutable shared<map> m;
140 mutable shared<map> m;
149 mutable shared<vector> v;
141 mutable shared<vector> v;
150− mutable shared<array> a;
151 mutable fn f;
142 mutable fn f;
152 mutable shared<closure> l;
143 mutable shared<closure> l;
153 mutable shared<eff_fn> e;
144 mutable shared<eff_fn> e;
@@ -182,9 +173,6 @@ class any {
182 any(const vector& val) : type(Type::Vector), v(make_shared<vector>(val)) {}
173 any(const vector& val) : type(Type::Vector), v(make_shared<vector>(val)) {}
183 any(vector&& val) noexcept : type(Type::Vector), v(make_shared<vector>(std::move(val))) {}
174 any(vector&& val) noexcept : type(Type::Vector), v(make_shared<vector>(std::move(val))) {}
185− any(const array& val) : type(Type::Array), a(make_shared<array>(val)) {}
186− any(array&& val) noexcept : type(Type::Array), a(make_shared<array>(std::move(val))) {}
188 template <typename T>
176 template <typename T>
189 any(const T& val, typename std::enable_if<std::is_convertible<T,fn>::value>::type* = 0)
177 any(const T& val, typename std::enable_if<std::is_convertible<T,fn>::value>::type* = 0)
190 : type(Type::Function), f(val) {}
178 : type(Type::Function), f(val) {}
@@ -240,14 +228,8 @@ class any {
240 template <typename T>
228 template <typename T>
241 auto cast() const -> typename std::enable_if<std::is_same<T, map>::value, const T&>::type;
229 auto cast() const -> typename std::enable_if<std::is_same<T, map>::value, const T&>::type;
243− // These cannot be thunked
244− template <typename T>
245− inline auto cast() const -> typename std::enable_if<std::is_same<T, vector>::value, const T&>::type {
249 template <typename T>
231 template <typename T>
250− auto cast() const -> typename std::enable_if<std::is_same<T, array>::value, const T&>::type;
232+ auto cast() const -> typename std::enable_if<std::is_same<T, vector>::value, const T&>::type;
252 template <typename T>
234 template <typename T>
253 auto cast() const -> typename std::enable_if<std::is_assignable<shared<void>,T>::value, typename T::element_type*>::type {
235 auto cast() const -> typename std::enable_if<std::is_assignable<shared<void>,T>::value, typename T::element_type*>::type {
@@ -267,10 +249,9 @@ class any {
267 operator string() const;
249 operator string() const;
268 operator const map&() const;
250 operator const map&() const;
269 operator const vector&() const;
251 operator const vector&() const;
270− operator const array&() const;
272 auto operator[](const char[]) const -> const any&;
253 auto operator[](const char[]) const -> const any&;
273− auto operator[](const size_t) const -> const any&;
254+ auto operator[](const vector::size_type) const -> const any&;
274 auto operator[](const any&) const -> const any&;
255 auto operator[](const any&) const -> const any&;
276 auto contains(const char[]) const -> bool;
257 auto contains(const char[]) const -> bool;