dynamic& dynamic::operator=(dynamic const& o) {
if (&o != this) {
- destroy();
+ if (type_ == o.type_) {
+#define FB_X(T) *getAddress<T>() = *o.getAddress<T>()
+ FB_DYNAMIC_APPLY(type_, FB_X);
+#undef FB_X
+ } else {
+ destroy();
#define FB_X(T) new (getAddress<T>()) T(*o.getAddress<T>())
- FB_DYNAMIC_APPLY(o.type_, FB_X);
+ FB_DYNAMIC_APPLY(o.type_, FB_X);
#undef FB_X
- type_ = o.type_;
+ type_ = o.type_;
+ }
}
return *this;
}
dynamic& dynamic::operator=(dynamic&& o) noexcept {
if (&o != this) {
- destroy();
+ if (type_ == o.type_) {
+#define FB_X(T) *getAddress<T>() = std::move(*o.getAddress<T>())
+ FB_DYNAMIC_APPLY(type_, FB_X);
+#undef FB_X
+ } else {
+ destroy();
#define FB_X(T) new (getAddress<T>()) T(std::move(*o.getAddress<T>()))
- FB_DYNAMIC_APPLY(o.type_, FB_X);
+ FB_DYNAMIC_APPLY(o.type_, FB_X);
#undef FB_X
- type_ = o.type_;
+ type_ = o.type_;
+ }
}
return *this;
}
EXPECT_EQ(dynamic(2), *cobject.get_ptr("two"));
}
+TEST(Dynamic, Assignment) {
+ const dynamic ds[] = { { 1, 2, 3 },
+ dynamic::object("a", true),
+ 24,
+ 26.5,
+ true,
+ "hello", };
+ const dynamic dd[] = { { 5, 6 },
+ dynamic::object("t", "T")(1, 7),
+ 9000,
+ 3.14159,
+ false,
+ "world", };
+ for (const auto& source : ds) {
+ for (const auto& dest : dd) {
+ dynamic tmp(dest);
+ EXPECT_EQ(tmp, dest);
+ tmp = source;
+ EXPECT_EQ(tmp, source);
+ }
+ }
+}
+
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
gflags::ParseCommandLineFlags(&argc, &argv, true);