#include #include #include #include #include #include "variant.h" using std::cin; using std::cout; using std::endl; /* using std::get; using std::holds_alternative; template using Variant = std::variant; */ struct A { A() { cout << "construct ()" << endl; } A(const A&) { cout << "construct (const A&)" << endl; } A(A&& a) { cout << "A(&&)" << endl; } A& operator=(const A&) { cout << "operator= (const A&)" << endl; return *this; } A& operator=(A&& another) { cout << "=&&" << endl; return *this; } ~A() { cout << "~A()" << endl; } }; void compile_test() { int x; { Variant v(1.0); const Variant cv(1.0); Variant> vv; holds_alternative(v); get(v); get(cv); static_assert(!std::is_assignable_v>); // static_assert(!std::is_assignable_v); static_assert(!std::is_assignable_v, double > ); static_assert(!std::is_assignable_v(cv)), double>); static_assert(std::is_rvalue_reference_v(std::move(v)))>); static_assert(std::is_lvalue_reference_v(v))>); } { Variant v = "abcdefgh"; v = "lakjdflksd"; v = std::string("alksdjfasf"); Variant vv("abcdefgh"); assert(get(vv).size() == 8); Variant> vvv = "abcdefgh"; Variant> vvvv("abcdefgh"); Variant vvvvv(std::string("alskdjflaksf")); Variant vvvvvv = std::string("alskdjflaksf"); } { // У тебя должен быть // template // void emplace(std::initializer_list, Args&&...); // // https://en.cppreference.com/w/cpp/utility/variant/emplace using vec = std::vector; Variant v; vec& a = v.emplace>({1, 2, 3}); // Также долежн быть emplace по индексу vec& b = v.emplace<0>(std::vector(2)); // Также долежн быть emplace по индексу и std::initializer_list :) vec& c = v.emplace<0>({1, 2, 3}); } { Variant v; // Пока хз как это решить // static_assert(!std::is_assignable_v); // v = 10; } { Variant v = 1; Variant vvv = 1.0f; std::variant vv = 1.0f; std::cout << std::is_constructible_v << std::endl; } cout << "compile test passed" << endl; } void test1() { int x; { const Variant v(10); std::cout << get(v) << std::endl; assert(get(v) == 10); { int cnt_try = 0; try { get(v); } catch (...) { cnt_try++; } try { get<0>(v); } catch (...) { cnt_try++; } assert(cnt_try == 2); } } { Variant v(10); assert(get(v) == 10); v = 11; assert(get(v) == 11); get(v)++; assert(get(v) == 12); } { Variant> v; // assert(v.valueless_by_exception()); } cout << "test1 passed" << endl; } void string_test() { Variant v = "abcdefgh"; assert(v.index() == 0); v = "lakjdflksd"; assert(get(v).size() == 10); assert(v.index() == 0); v = std::string("a"); assert(get(v).size() == 1); assert(v.index() == 0); Variant vv("ab"); assert(get(vv).size() == 2); assert(vv.index() == 0); vv = "als"; assert(get(vv).size() == 3); assert(vv.index() == 0); vv = std::string("alsd"); assert(get(vv).size() == 4); assert(vv.index() == 0); Variant> vvv = "abcdefgh"; assert(vvv.index() == 0); vvv = "alksjdgasg"; assert(vvv.index() == 0); vvv = "alskdjglkagj"; assert(vvv.index() == 0); Variant> vvvv("abcdefgh"); assert(vvvv.index() == 0); vvvv = "asljgs;lgdk"; assert(vvvv.index() == 0); vvvv = "al;kdja;k"; assert(vvvv.index() == 0); Variant vvvvv(std::string("alskdjflaksf")); assert(vvvvv.index() == 0); vvvvv = "a;kjga;g"; assert(vvvvv.index() == 0); vvvvv = "asdjg;alkjg;alkjg"; assert(vvvvv.index() == 0); Variant vvvvvv = std::string("alskdjflaksf"); assert(vvvvvv.index() == 0); vvvvvv = "askjga;j"; assert(vvvvvv.index() == 0); vvvvvv = "a;lkjdg;aldjg"; assert(vvvvvv.index() == 0); cout << "string test passed" << endl; } int testConstr = 0; int testDestroy = 0; template struct TestDelete { TestDelete() { testConstr++; } ~TestDelete() { ++testDestroy; } }; int countDelete = 0; void operator delete[](void* ptr) { countDelete++; } void operator delete(void* ptr) { countDelete++; } void test2() { countDelete = 0; { Variant, TestDelete<1>, TestDelete<2>> v; } // assert(testDestroy == 1); assert(testConstr == 1); // assert(countDelete == 1); { std::variant, TestDelete<1>, TestDelete<2>> v; v = TestDelete<1>(); v = TestDelete<2>(); } // assert(testDestroy == 6); assert(testConstr == 4); std::cout << countDelete << std::endl; // assert(countDelete == 2); std::cout << "test2 passed" << std::endl; } void test3() { using VAR = Variant; VAR x = "ddd"; { VAR v("als"); x = std::move(v); } std::cout << get<0>(x) << std::endl; assert(get<0>(x) == "als"); std::cout << "test3 passed"; } void test4() { { Variant v = 1.0; assert(v.index() == 1); } { Variant v = 1.0f; assert(v.index() == 1); } { Variant v = 1; assert(v.index() == 0); } { Variant v = 'a'; assert(v.index() == 0); } } int main() { compile_test(); test1(); string_test(); test2(); test3(); test4(); // std::variant v; // get(v) = 10; }