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