@@ -48,30 +48,30 @@ using std::nullptr_t;
48using std::runtime_error;
48using std::runtime_error;
50namespace Private {
50namespace Private {
51− struct symbol_generator_anchor_t {};
51+ struct SymbolGeneratorAnchor {};
53 template <typename T>
53 template <typename T>
54− struct symbol_generator {
54+ struct SymbolGenerator {
55− constexpr static symbol_generator_anchor_t anchor = symbol_generator_anchor_t{};
55+ constexpr static SymbolGeneratorAnchor anchor = SymbolGeneratorAnchor{};
57 template <typename T>
57 template <typename T>
58− constexpr symbol_generator_anchor_t symbol_generator<T>::anchor;
58+ constexpr SymbolGeneratorAnchor SymbolGenerator<T>::anchor;
61−using symbol_t = const Private::symbol_generator_anchor_t *;
60+ using Symbol = const SymbolGeneratorAnchor *;
63#define define_symbol(S) namespace PureScript { \
63#define define_symbol(S) namespace PureScript { \
64 namespace Private { \
64 namespace Private { \
65− namespace Symbol { \
65+ namespace Symbols { \
66 struct S_ ## S {}; \
66 struct S_ ## S {}; \
70−#define symbol(S) (&Private::symbol_generator<::PureScript::Private::Symbol::S_ ## S>::anchor)
70+#define symbol(S) (&Private::SymbolGenerator<::PureScript::Private::Symbols::S_ ## S>::anchor)
72constexpr bool undefined = false;
72constexpr bool undefined = false;
74−// Not a real limit, just used for simpler accessors
74+// TODO: Not a real limit, just used for simpler accessors
75static constexpr size_t unknown_size = 64;
75static constexpr size_t unknown_size = 64;
77// A variant data class designed to provide some features of dynamic typing.
77// A variant data class designed to provide some features of dynamic typing.
@@ -79,7 +79,7 @@ static constexpr size_t unknown_size = 64;
79class any {
79class any {
82− enum class tag_t {
82+ enum class Tag {
83 Thunk = 0x10,
83 Thunk = 0x10,
@@ -99,14 +99,14 @@ class any {
102− mutable tag_t tag;
102+ mutable Tag tag;
105 struct as_thunk {
105 struct as_thunk {
107 static constexpr as_thunk unthunk = as_thunk{};
107 static constexpr as_thunk unthunk = as_thunk{};
109− using map_pair = std::pair<const symbol_t, const any>;
109+ using map_pair = std::pair<const Private::Symbol, const any>;
111 template <size_t N>
111 template <size_t N>
112 using map = std::array<const map_pair, N>;
112 using map = std::array<const map_pair, N>;
@@ -120,33 +120,33 @@ class any {
120 using thunk = auto (*)(const as_thunk) -> const any&;
120 using thunk = auto (*)(const as_thunk) -> const any&;
123− class closure {
123+ class Closure {
125 virtual auto operator()(const any&) const -> any = 0;
125 virtual auto operator()(const any&) const -> any = 0;
126− virtual ~closure();
126+ virtual ~Closure();
129 template <typename T>
129 template <typename T>
130− class closure_ : public closure {
130+ class Closure_ : public Closure {
131 const T lambda;
131 const T lambda;
133− closure_(const T& l) noexcept : lambda(l) {}
133+ Closure_(const T& l) noexcept : lambda(l) {}
134 auto operator()(const any& arg) const -> any override {
134 auto operator()(const any& arg) const -> any override {
135 return lambda(arg);
135 return lambda(arg);
139− class eff_closure {
139+ class EffClosure {
141 virtual auto operator()() const -> any = 0;
141 virtual auto operator()() const -> any = 0;
142− virtual ~eff_closure();
142+ virtual ~EffClosure();
145 template <typename T>
145 template <typename T>
146− class eff_closure_ : public eff_closure {
146+ class EffClosure_ : public EffClosure {
147 const T lambda;
147 const T lambda;
149− eff_closure_(const T& l) noexcept : lambda(l) {}
149+ EffClosure_(const T& l) noexcept : lambda(l) {}
150 auto operator()() const -> any override {
150 auto operator()() const -> any override {
151 return lambda();
151 return lambda();
@@ -165,82 +165,82 @@ class any {
165 mutable void * u;
165 mutable void * u;
166 mutable managed<std::string> s;
166 mutable managed<std::string> s;
167 mutable managed<array> a;
167 mutable managed<array> a;
168− mutable managed<closure> l;
168+ mutable managed<Closure> l;
169− mutable managed<eff_closure> k;
169+ mutable managed<EffClosure> k;
170 mutable managed<void> p;
170 mutable managed<void> p;
175− any(const int val) noexcept : tag(tag_t::Integer), i(val) {}
175+ any(const int val) noexcept : tag(Tag::Integer), i(val) {}
176− any(const long val) noexcept : tag(tag_t::Integer), i(static_cast<decltype(i)>(val)) {
176+ any(const long val) noexcept : tag(Tag::Integer), i(static_cast<decltype(i)>(val)) {
177 assert(val >= std::numeric_limits<decltype(i)>::min() &&
177 assert(val >= std::numeric_limits<decltype(i)>::min() &&
178 val <= std::numeric_limits<decltype(i)>::max());
178 val <= std::numeric_limits<decltype(i)>::max());
181− any(const double val) noexcept : tag(tag_t::Double), d(val) {}
181+ any(const double val) noexcept : tag(Tag::Double), d(val) {}
182− any(const char val) noexcept : tag(tag_t::Character), c(val) {}
182+ any(const char val) noexcept : tag(Tag::Character), c(val) {}
184 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
184 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
185− any(const T val) noexcept : tag(tag_t::Boolean), b(val) {}
185+ any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
187 template <size_t N>
187 template <size_t N>
188− any(const char (&val)[N]) noexcept : tag(tag_t::StringLiteral), r(val) {}
188+ any(const char (&val)[N]) noexcept : tag(Tag::StringLiteral), r(val) {}
189− any(char * val) : tag(tag_t::String), s(make_managed<std::string>(val)) {}
189+ any(char * val) : tag(Tag::String), s(make_managed<std::string>(val)) {}
191− any(const std::string& val) : tag(tag_t::String), s(make_managed<std::string>(val)) {}
191+ any(const std::string& val) : tag(Tag::String), s(make_managed<std::string>(val)) {}
192− any(std::string&& val) noexcept : tag(tag_t::String), s(make_managed<std::string>(std::move(val))) {}
192+ any(std::string&& val) noexcept : tag(Tag::String), s(make_managed<std::string>(std::move(val))) {}
194− any(const managed<std::string>& val) noexcept : tag(tag_t::String), s(val) {}
194+ any(const managed<std::string>& val) noexcept : tag(Tag::String), s(val) {}
195− any(managed<std::string>&& val) noexcept : tag(tag_t::String), s(std::move(val)) {}
195+ any(managed<std::string>&& val) noexcept : tag(Tag::String), s(std::move(val)) {}
197 template <size_t N>
197 template <size_t N>
198− any(map<N>&& val) noexcept : tag(tag_t::Map), p(make_managed<map<N>>(std::move(val))) {}
198+ any(map<N>&& val) noexcept : tag(Tag::Map), p(make_managed<map<N>>(std::move(val))) {}
200 template <size_t N>
200 template <size_t N>
201− any(data<N>&& val) noexcept : tag(tag_t::Data), p(make_managed<data<N>>(std::move(val))) {}
201+ any(data<N>&& val) noexcept : tag(Tag::Data), p(make_managed<data<N>>(std::move(val))) {}
203− any(const array& val) : tag(tag_t::Array), a(make_managed<array>(val)) {}
203+ any(const array& val) : tag(Tag::Array), a(make_managed<array>(val)) {}
204− any(array&& val) noexcept : tag(tag_t::Array), a(make_managed<array>(std::move(val))) {}
204+ any(array&& val) noexcept : tag(Tag::Array), a(make_managed<array>(std::move(val))) {}
206 template <typename T>
206 template <typename T>
207 any(const T& val, typename std::enable_if<std::is_convertible<T,fn>::value>::type* = 0) noexcept
207 any(const T& val, typename std::enable_if<std::is_convertible<T,fn>::value>::type* = 0) noexcept
208− : tag(tag_t::Function), f(val) {}
208+ : tag(Tag::Function), f(val) {}
210 template <typename T, typename = typename std::enable_if<!std::is_same<any,T>::value &&
210 template <typename T, typename = typename std::enable_if<!std::is_same<any,T>::value &&
211 !std::is_convertible<T,fn>::value>::type>
211 !std::is_convertible<T,fn>::value>::type>
212 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any(const any&)>,T>::value>::type* = 0)
212 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any(const any&)>,T>::value>::type* = 0)
213− : tag(tag_t::Closure), l(make_managed<closure_<T>>(val)) {}
213+ : tag(Tag::Closure), l(make_managed<Closure_<T>>(val)) {}
215 template <typename T>
215 template <typename T>
216 any(const T& val, typename std::enable_if<std::is_convertible<T,eff_fn>::value>::type* = 0) noexcept
216 any(const T& val, typename std::enable_if<std::is_convertible<T,eff_fn>::value>::type* = 0) noexcept
217− : tag(tag_t::EffFunction), e(val) {}
217+ : tag(Tag::EffFunction), e(val) {}
219 template <typename T,
219 template <typename T,
220 typename = typename std::enable_if<!std::is_same<any,T>::value &&
220 typename = typename std::enable_if<!std::is_same<any,T>::value &&
221 !std::is_convertible<T,eff_fn>::value>::type>
221 !std::is_convertible<T,eff_fn>::value>::type>
222 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any()>,T>::value>::type* = 0)
222 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any()>,T>::value>::type* = 0)
223− : tag(tag_t::EffClosure), k(make_managed<eff_closure_<T>>(val)) {}
223+ : tag(Tag::EffClosure), k(make_managed<EffClosure_<T>>(val)) {}
225 template <typename T>
225 template <typename T>
226 any(const T& val, typename std::enable_if<std::is_convertible<T,thunk>::value>::type* = 0) noexcept
226 any(const T& val, typename std::enable_if<std::is_convertible<T,thunk>::value>::type* = 0) noexcept
227− : tag(tag_t::Thunk), t(val) {}
227+ : tag(Tag::Thunk), t(val) {}
229 template <typename T,
229 template <typename T,
230 typename = typename std::enable_if<std::is_class<typename std::remove_pointer<T>::type>::value>::type>
230 typename = typename std::enable_if<std::is_class<typename std::remove_pointer<T>::type>::value>::type>
231 any(const T& val, typename std::enable_if<IS_POINTER_TYPE(T)::value>::type* = 0) noexcept
231 any(const T& val, typename std::enable_if<IS_POINTER_TYPE(T)::value>::type* = 0) noexcept
232− : tag(tag_t::Pointer), p(val) {}
232+ : tag(Tag::Pointer), p(val) {}
234 template <typename T>
234 template <typename T>
235 any(T&& val, typename std::enable_if<std::is_assignable<managed<void>,T>::value>::type* = 0) noexcept
235 any(T&& val, typename std::enable_if<std::is_assignable<managed<void>,T>::value>::type* = 0) noexcept
236− : tag(tag_t::Pointer), p(std::move(val)) {}
236+ : tag(Tag::Pointer), p(std::move(val)) {}
238 // Explicit void* to raw pointer value
238 // Explicit void* to raw pointer value
239 template <typename T>
239 template <typename T>
240 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
240 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
241− : tag(tag_t::RawPointer), u(val) {}
241+ : tag(Tag::RawPointer), u(val) {}
243− any(nullptr_t) noexcept : tag(tag_t::RawPointer), u(nullptr) {}
243+ any(nullptr_t) noexcept : tag(Tag::RawPointer), u(nullptr) {}
246#if !defined(USE_GC)
246#if !defined(USE_GC)
@@ -262,23 +262,23 @@ class any {
262 template <typename T>
262 template <typename T>
263 auto assign(T&& other) const noexcept -> void {
263 auto assign(T&& other) const noexcept -> void {
264 switch (other.tag) {
264 switch (other.tag) {
265− case tag_t::Thunk: t = other.t; break;
265+ case Tag::Thunk: t = other.t; break;
266− case tag_t::Integer: i = other.i; break;
266+ case Tag::Integer: i = other.i; break;
267− case tag_t::Double: d = other.d; break;
267+ case Tag::Double: d = other.d; break;
268− case tag_t::Character: c = other.c; break;
268+ case Tag::Character: c = other.c; break;
269− case tag_t::Boolean: b = other.b; break;
269+ case Tag::Boolean: b = other.b; break;
270− case tag_t::StringLiteral: r = other.r; break;
270+ case Tag::StringLiteral: r = other.r; break;
271− case tag_t::Function: f = other.f; break;
271+ case Tag::Function: f = other.f; break;
272− case tag_t::EffFunction: e = other.e; break;
272+ case Tag::EffFunction: e = other.e; break;
273− case tag_t::RawPointer: u = other.u; break;
273+ case Tag::RawPointer: u = other.u; break;
275− case tag_t::String: new (&s) managed<std::string>(move_if_rvalue<T>(other.s)); break;
275+ case Tag::String: new (&s) managed<std::string>(move_if_rvalue<T>(other.s)); break;
276− case tag_t::Array: new (&a) managed<array>(move_if_rvalue<T>(other.a)); break;
276+ case Tag::Array: new (&a) managed<array>(move_if_rvalue<T>(other.a)); break;
277− case tag_t::Closure: new (&l) managed<closure>(move_if_rvalue<T>(other.l)); break;
277+ case Tag::Closure: new (&l) managed<Closure>(move_if_rvalue<T>(other.l)); break;
278− case tag_t::EffClosure: new (&k) managed<eff_closure>(move_if_rvalue<T>(other.k)); break;
278+ case Tag::EffClosure: new (&k) managed<EffClosure>(move_if_rvalue<T>(other.k)); break;
279− case tag_t::Map:
279+ case Tag::Map:
280− case tag_t::Data:
280+ case Tag::Data:
281− case tag_t::Pointer: new (&p) managed<void>(move_if_rvalue<T>(other.p)); break;
281+ case Tag::Pointer: new (&p) managed<void>(move_if_rvalue<T>(other.p)); break;
283 default: assert(false && "Bad 'any' tag"); break;
283 default: assert(false && "Bad 'any' tag"); break;
@@ -286,13 +286,13 @@ class any {
287 auto destruct() -> void {
287 auto destruct() -> void {
288 switch (tag) {
288 switch (tag) {
289− case tag_t::String: s.~managed<std::string>(); break;
289+ case Tag::String: s.~managed<std::string>(); break;
290− case tag_t::Array: a.~managed<array>(); break;
290+ case Tag::Array: a.~managed<array>(); break;
291− case tag_t::Closure: l.~managed<closure>(); break;
291+ case Tag::Closure: l.~managed<Closure>(); break;
292− case tag_t::EffClosure: k.~managed<eff_closure>(); break;
292+ case Tag::EffClosure: k.~managed<EffClosure>(); break;
293− case tag_t::Map:
293+ case Tag::Map:
294− case tag_t::Data:
294+ case Tag::Data:
295− case tag_t::Pointer: p.~managed<void>(); break;
295+ case Tag::Pointer: p.~managed<void>(); break;
297 default: break;
297 default: break;
@@ -345,13 +345,13 @@ class any {
346 auto size() const -> size_t;
346 auto size() const -> size_t;
347 auto empty() const -> bool;
347 auto empty() const -> bool;
348− auto contains(const symbol_t) const -> bool;
348+ auto contains(const Private::Symbol) const -> bool;
350− auto extractPointer(IF_DEBUG(const tag_t)) const -> void*;
350+ auto extractPointer(IF_DEBUG(const Tag)) const -> void*;
352 auto rawPointer() const -> void* {
352 auto rawPointer() const -> void* {
353 const any& variant = unthunkVariant(*this);
353 const any& variant = unthunkVariant(*this);
354− assert(tag == tag_t::RawPointer);
354+ assert(tag == Tag::RawPointer);
355 return variant.u;
355 return variant.u;
@@ -418,21 +418,21 @@ class any {
419namespace Private {
419namespace Private {
420 template <typename T, typename U=void>
420 template <typename T, typename U=void>
421− struct tag_helper_t {};
421+ struct TagHelper {};
423 template <size_t N>
423 template <size_t N>
424− struct tag_helper_t<any::map<N>> {
424+ struct TagHelper<any::map<N>> {
425− static constexpr any::tag_t tag = any::tag_t::Map;
425+ static constexpr any::Tag tag = any::Tag::Map;
428 template <size_t N>
428 template <size_t N>
429− struct tag_helper_t<any::data<N>> {
429+ struct TagHelper<any::data<N>> {
430− static constexpr any::tag_t tag = any::tag_t::Data;
430+ static constexpr any::Tag tag = any::Tag::Data;
433 template <typename T>
433 template <typename T>
434− struct tag_helper_t<T> {
434+ struct TagHelper<T> {
435− static constexpr any::tag_t tag = any::tag_t::Pointer;
435+ static constexpr any::Tag tag = any::Tag::Pointer;
@@ -458,7 +458,7 @@ inline auto cast(const any& a) ->
458template <typename T, typename = typename std::enable_if<std::is_class<T>::value>::type>
458template <typename T, typename = typename std::enable_if<std::is_class<T>::value>::type>
459inline auto cast(const any& a) ->
459inline auto cast(const any& a) ->
460 typename std::enable_if<!std::is_same<T, any::array>::value, T&>::type {
460 typename std::enable_if<!std::is_same<T, any::array>::value, T&>::type {
461− return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::tag_helper_t<T>::tag)));
461+ return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
464template <typename T>
464template <typename T>
@@ -480,7 +480,7 @@ namespace map {
482 template <size_t N>
482 template <size_t N>
483− inline auto get(const symbol_t key, const any::map<N>& a) -> const any& {
483+ inline auto get(const Private::Symbol key, const any::map<N>& a) -> const any& {
484 static_assert(N > 0, "map size must be greater than zero");
484 static_assert(N > 0, "map size must be greater than zero");
485 typename std::remove_reference<decltype(a)>::type::size_type i = 0;
485 typename std::remove_reference<decltype(a)>::type::size_type i = 0;
@@ -493,7 +493,7 @@ namespace map {
493 return invalid_key;
493 return invalid_key;
496− inline auto get(const symbol_t key, const any& a) -> const any& {
496+ inline auto get(const Private::Symbol key, const any& a) -> const any& {
497 return get(key, cast<any::map<unknown_size>>(a));
497 return get(key, cast<any::map<unknown_size>>(a));