@@ -16,41 +16,64 @@
1616
1717namespace PureScript {
1818
19−any::any(const any& val) : type(val.type) {
20− switch (type) {
21− case Type::Integer: i = val.i; break;
22− case Type::Double: d = val.d; break;
23− case Type::Character: c = val.c; break;
24− case Type::Boolean: b = val.b; break;
25− case Type::String: new (&s) shared<string> (val.s); break;
26− case Type::Map: new (&m) shared<map> (val.m); break;
27− case Type::Vector: new (&v) shared<vector> (val.v); break;
28− case Type::Function: new (&f) shared<fn> (val.f); break;
29− case Type::EffFunction: new (&e) shared<eff_fn> (val.e); break;
30− case Type::Thunk: new (&t) shared<thunk> (val.t); break;
31− case Type::Pointer: new (&p) shared<void> (val.p); break;
32−
33− default: assert(false && "Unsupported type in copy ctor");
34− }
19+#define copy_data(src) \
20+ type = src.type; \
21+ switch (type) { \
22+ case Type::Integer: i = src.i; break; \
23+ case Type::Double: d = src.d; break; \
24+ case Type::Character: c = src.c; break; \
25+ case Type::Boolean: b = src.b; break; \
26+ case Type::String: new (&s) shared<string> (src.s); break; \
27+ case Type::Map: new (&m) shared<map> (src.m); break; \
28+ case Type::Vector: new (&v) shared<vector> (src.v); break; \
29+ case Type::Function: new (&f) shared<fn> (src.f); break; \
30+ case Type::EffFunction: new (&e) shared<eff_fn> (src.e); break; \
31+ case Type::Thunk: new (&t) shared<thunk> (src.t); break; \
32+ case Type::Pointer: new (&p) shared<void> (src.p); break; \
33+ \
34+ default: assert(false && "Unsupported type in copy"); \
35+ }
36+
37+#define move_data(src) \
38+ type = src.type; \
39+ switch (type) { \
40+ case Type::Integer: i = src.i; break; \
41+ case Type::Double: d = src.d; break; \
42+ case Type::Character: c = src.c; break; \
43+ case Type::Boolean: b = src.b; break; \
44+ case Type::String: new (&s) shared<string> (std::move(src.s)); break; \
45+ case Type::Map: new (&m) shared<map> (std::move(src.m)); break; \
46+ case Type::Vector: new (&v) shared<vector> (std::move(src.v)); break; \
47+ case Type::Function: new (&f) shared<fn> (std::move(src.f)); break; \
48+ case Type::EffFunction: new (&e) shared<eff_fn> (std::move(src.e)); break; \
49+ case Type::Thunk: new (&t) shared<thunk> (std::move(src.t)); break; \
50+ case Type::Pointer: new (&p) shared<void> (std::move(src.p)); break; \
51+ \
52+ default: assert(false && "Unsupported type in move"); \
53+ }
54+
55+any::any(const any& other) {
56+ copy_data(other);
3557}
3658
37−void any::swap(any&& val) const {
38− type = val.type;
39− switch (type) {
40− case Type::Integer: i = val.i; break;
41− case Type::Double: d = val.d; break;
42− case Type::Character: c = val.c; break;
43− case Type::Boolean: b = val.b; break;
44− case Type::String: new (&s) shared<string> (std::move(val.s)); break;
45− case Type::Map: new (&m) shared<map> (std::move(val.m)); break;
46− case Type::Vector: new (&v) shared<vector> (std::move(val.v)); break;
47− case Type::Function: new (&f) shared<fn> (std::move(val.f)); break;
48− case Type::EffFunction: new (&e) shared<eff_fn> (std::move(val.e)); break;
49− case Type::Thunk: new (&t) shared<thunk> (std::move(val.t)); break;
50− case Type::Pointer: new (&p) shared<void> (std::move(val.p)); break;
51−
52− default: assert(false && "Unsupported type in move ctor");
53− }
59+any::any(any&& other) {
60+ move_data(other);
61+}
62+
63+auto any::operator=(const any& rhs) -> any& {
64+ copy_data(rhs);
65+ return *this;
66+}
67+
68+// Takes ownership -- might need to reconsider this
69+auto any::operator=(any& rhs) -> any& {
70+ move_data(rhs);
71+ return *this;
72+}
73+
74+auto any::operator=(any&& rhs) -> any& {
75+ move_data(rhs);
76+ return *this;
5477}
5578
5679any::~any() {