49 static_assert(
sizeof(subject) ==
sizeof(subject.
val));
53 BEAST_EXPECT(subject.
val.
size() == 3);
56 subject.
val[0] = obj1;
57 subject.
val[1] = obj2;
60 testcase(
"forApiVersions, forAllApiVersions");
63 static int const kPrimes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
64 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
71 int productAllVersions = 1;
76 BEAST_EXPECT(index == s1.
index(i));
77 BEAST_EXPECT(s1.
valid(i));
79 productAllVersions *= kPrimes[i];
81 BEAST_EXPECT(!s1.
valid(0));
83 BEAST_EXPECT(!s1.
valid(
94 if (BEAST_EXPECT(
json.isMember(
"value")))
96 *result *=
json[
"value"].asInt();
107 BEAST_EXPECT(s1.val[s1.index(version)] == json);
108 if (BEAST_EXPECT(json.isMember(
"value")))
110 BEAST_EXPECT(json[
"value"].asInt() == kPrimes[version]);
121 if (BEAST_EXPECT(
json.isMember(
"value")))
123 *result *=
json[
"value"].asInt();
128 BEAST_EXPECT(result == productAllVersions);
131 static_assert([](
auto&& v) {
138 static_assert([](
auto&& v) {
145 static_assert([](
auto&& v) {
152 static_assert([](
auto&& v) {
160 static_assert([](
auto&& v) {
168 static_assert([](
auto&& v) {
172 [](
auto,
auto,
char const*) {},
178 static_assert([](
auto&& v) {
185 static_assert([](
auto&& v) {
192 static_assert([](
auto&& v) {
199 static_assert([](
auto&& v) {
206 static_assert([](
auto&& v) {
215 static_assert([](
auto&& v) {
219 []<
unsigned int Version>(
228 static_assert([](
auto&& v) {
235 static_assert([](
auto&& v) {
245 testcase(
"default copy construction / assignment");
250 BEAST_EXPECT(x.
val[0] == subject.val[0]);
251 BEAST_EXPECT(x.
val[1] == subject.val[1]);
252 BEAST_EXPECT(x.
val[2] == subject.val[2]);
253 BEAST_EXPECT(x.
val == subject.val);
254 BEAST_EXPECT(&x.
val[0] != &subject.val[0]);
255 BEAST_EXPECT(&x.
val[1] != &subject.val[1]);
256 BEAST_EXPECT(&x.
val[2] != &subject.val[2]);
261 BEAST_EXPECT(y.
val == subject.val);
262 BEAST_EXPECT(&y.
val[0] != &subject.val[0]);
263 BEAST_EXPECT(&y.
val[1] != &subject.val[1]);
264 BEAST_EXPECT(&y.
val[2] != &subject.val[2]);
267 BEAST_EXPECT(y.
val == subject.val);
268 BEAST_EXPECT(&y.
val[0] != &subject.val[0]);
269 BEAST_EXPECT(&y.
val[1] != &subject.val[1]);
270 BEAST_EXPECT(&y.
val[2] != &subject.val[2]);
278 BEAST_EXPECT(x.
val[0].isMember(
"name1"));
279 BEAST_EXPECT(x.
val[1].isMember(
"name1"));
280 BEAST_EXPECT(x.
val[0][
"name1"].isInt());
281 BEAST_EXPECT(x.
val[1][
"name1"].isInt());
282 BEAST_EXPECT(x.
val[0][
"name1"].asInt() == 42);
283 BEAST_EXPECT(x.
val[1][
"name1"].asInt() == 42);
285 x.
set(
"name2",
"bar");
286 BEAST_EXPECT(x.
val[0].isMember(
"name2"));
287 BEAST_EXPECT(x.
val[1].isMember(
"name2"));
288 BEAST_EXPECT(x.
val[0][
"name2"].isString());
289 BEAST_EXPECT(x.
val[1][
"name2"].isString());
290 BEAST_EXPECT(x.
val[0][
"name2"].asString() ==
"bar");
291 BEAST_EXPECT(x.
val[1][
"name2"].asString() ==
"bar");
296 static_assert([](
auto&& v) {
return requires { v.set(
"name",
"value"); }; }(x));
297 static_assert([](
auto&& v) {
return requires { v.set(
"name",
true); }; }(x));
298 static_assert([](
auto&& v) {
return requires { v.set(
"name", 42); }; }(x));
304 static_assert([](
auto&& v) {
return !
requires { v.set(
"name", FooT{}); }; }(x));
305 static_assert([](
auto&& v) {
return !
requires { v.set(
"name", std::nullopt); }; }(x));
312 BEAST_EXPECT(subject.isMember(
"foo") ==
decltype(subject)::IsMemberResult::None);
319 BEAST_EXPECT(s1.isMember(
"One") ==
decltype(s1)::IsMemberResult::All);
320 BEAST_EXPECT(s1.isMember(
"Two") ==
decltype(s1)::IsMemberResult::None);
328 BEAST_EXPECT(s2.isMember(
"One") ==
decltype(s2)::IsMemberResult::Some);
329 BEAST_EXPECT(s2.isMember(
"Two") ==
decltype(s2)::IsMemberResult::Some);
337 BEAST_EXPECT(s3.isMember(
"One") ==
decltype(s3)::IsMemberResult::Some);
338 BEAST_EXPECT(s3.isMember(
"Two") ==
decltype(s3)::IsMemberResult::None);
350 BEAST_EXPECT(not s1.valid(0));
351 BEAST_EXPECT(s1.index(0) == 0);
353 BEAST_EXPECT(s1.valid(1));
354 BEAST_EXPECT(s1.index(1) == 0);
356 BEAST_EXPECT(not s1.valid(4));
359 static_assert([](
auto&& v) {
363 std::integral_constant<unsigned, 1>{},
364 [](json::Value&, std::integral_constant<unsigned, 1>) {});
370 std::integral_constant<unsigned, 1>{},
372 [](json::Value& v, std::integral_constant<unsigned, 1>) {
373 return v[
"value"].asInt();
375 [](json::Value
const&,
auto) { return 0; },
376 [](
auto,
auto) { return 0; }}) == 2);
378 static_assert([](
auto&& v) {
380 v.kVisitor(v, std::integral_constant<unsigned, 1>{}, [](json::Value&) {});
386 std::integral_constant<unsigned, 1>{},
388 [](json::Value& v) { return v[
"value"].asInt(); },
389 [](json::Value
const&) { return 0; },
390 [](
auto...) { return 0; }}) == 2);
392 static_assert([](
auto&& v) {
396 std::integral_constant<unsigned, 1>{},
397 [](json::Value
const&, std::integral_constant<unsigned, 1>) {});
403 std::integral_constant<unsigned, 2>{},
405 [](json::Value const& v, std::integral_constant<unsigned, 2>) {
406 return v[
"value"].asInt();
408 [](json::Value&,
auto) { return 0; },
409 [](
auto,
auto) { return 0; }}) == 3);
411 static_assert([](
auto&& v) {
421 [](json::Value const& v) { return v[
"value"].asInt(); },
423 [](
auto...) { return 0; }}) == 3);
425 static_assert([](
auto&& v) {
426 return requires { v.kVisitor(v, 1, [](
json::Value&,
unsigned) {}); };
433 [](json::Value& v, unsigned) { return v[
"value"].asInt(); },
435 [](
auto,
auto) { return 0; }}) == 5);
438 [](
auto&& v) {
return requires { v.kVisitor(v, 1, [](
json::Value&) {}); }; }(s1));
444 [](json::Value& v) { return v[
"value"].asInt(); },
446 [](
auto...) { return 0; }}) == 5);
448 static_assert([](
auto&& v) {
449 return requires { v.kVisitor(v, 1, [](
json::Value const&,
unsigned) {}); };
456 [](json::Value const& v, unsigned) { return v[
"value"].asInt(); },
458 [](
auto,
auto) { return 0; }}) == 3);
460 static_assert([](
auto&& v) {
461 return requires { v.kVisitor(v, 1, [](
json::Value const&) {}); };
468 [](json::Value const& v) { return v[
"value"].asInt(); },
470 [](
auto...) { return 0; }}) == 3);
477 [](
json::Value& v,
unsigned) { return v[
"value"].asInt(); }) == 2);
482 [](
json::Value const& v,
unsigned) { return v[
"value"].asInt(); }) == 3);
487 [](
json::Value const& v,
auto) { return v[
"value"].asInt(); }) == 5);
492 [](
json::Value const& v) { return v[
"value"].asInt(); }) == 5);
497 [](
json::Value& v,
long) { return v[
"value"].asInt(); }) == 5);
502 [](
json::Value const& v,
long) { return v[
"value"].asInt(); }) == 2);
507 [](
json::Value const& v,
auto) { return v[
"value"].asInt(); }) == 3);
512 [](
auto& v,
auto) { return v[
"value"].asInt(); }) == 3);
517 [](
auto const& v,
auto) { return v[
"value"].asInt(); }) == 3);
522 [](
auto& v) { return v[
"value"].asInt(); }) == 3);
527 [](
auto const& v) { return v[
"value"].asInt(); }) == 3);
535 return ver * a1 * a2 * v[
"value"].asInt();
538 7) == 2 * 5 * 7 * 3);
544 return ver * (1 * ... * args) * v[
"value"].asInt();
547 7) == 2 * 5 * 7 * 3);
550 static_assert([](
auto&& v) {
559 static_assert([](
auto&& v) {
568 static_assert([](
auto&& v) {
577 static_assert([](
auto&& v) {
587 static_assert([](
auto&& v) {
return requires { v.kVisitor(v, 1, [](
auto) {}); }; }(s1));
590 [](
auto&& v) {
return requires { v.kVisitor(v, 1, [](
json::Value&) {}); }; }(s1));
592 static_assert([](
auto&& v) {
593 return requires { v.kVisitor(v, 1, [](
json::Value&,
auto...) {}); };
596 static_assert([](
auto&& v) {
597 return requires { v.kVisitor(v, 1, [](
json::Value const&) {}); };
600 static_assert([](
auto&& v) {
601 return requires { v.kVisitor(v, 1, [](
json::Value const&,
auto...) {}); };
605 [](
auto&& v) {
return requires { v.kVisitor(v, 1, [](
auto...) {}); }; }(s1));
608 [](
auto&& v) {
return requires { v.kVisitor(v, 1, [](
auto,
auto...) {}); }; }(s1));
610 static_assert([](
auto&& v) {
611 return requires { v.kVisitor(v, 1, [](
auto,
auto,
auto...) {}); };
614 static_assert([](
auto&& v) {
615 return requires { v.kVisitor(v, 1, [](
auto,
auto,
auto...) {},
""); };
618 static_assert([](
auto&& v) {
619 return requires { v.kVisitor(v, 1, [](
auto,
auto,
auto,
auto...) {},
""); };
626 MultiApiJson<1, 3> s1{};
627 s1.val[0] = makeJson(
"value", 2);
628 s1.val[1] = makeJson(
"value", 3);
629 s1.val[2] = makeJson(
"value", 5);
632 static_assert([](
auto&& v) {
643 [](json::Value& v, std::integral_constant<unsigned, 1>) {
644 return v[
"value"].asInt();
647 [](
auto,
auto) { return 0; }}) == 2);
648 static_assert([](
auto&& v) {
659 [](json::Value& v, std::integral_constant<unsigned, 1>) {
660 return v[
"value"].asInt();
663 [](
auto,
auto) { return 0; }}) == 2);
665 static_assert([](
auto&& v) {
674 [](json::Value& v) { return v[
"value"].asInt(); },
676 [](
auto...) { return 0; }}) == 2);
677 static_assert([](
auto&& v) {
686 [](json::Value& v) { return v[
"value"].asInt(); },
688 [](
auto...) { return 0; }}) == 2);
690 static_assert([](
auto&& v) {
702 return v[
"value"].
asInt();
705 [](
auto,
auto) {
return 0; }}) == 3);
706 static_assert([](
auto&& v) {
718 return v[
"value"].
asInt();
721 [](
auto,
auto) {
return 0; }}) == 3);
723 static_assert([](
auto&& v) {
734 [](
auto...) {
return 0; }}) == 3);
735 static_assert([](
auto&& v) {
746 [](
auto...) {
return 0; }}) == 3);
748 static_assert([](
auto&& v) {
749 return requires { v.visit(1, [](
json::Value&,
unsigned) {}); };
755 [](json::Value& v, unsigned) { return v[
"value"].asInt(); },
758 [](
auto,
auto) { return 0; }}) == 5);
759 static_assert([](
auto&& v) {
760 return requires { v.visit()(1, [](
json::Value&, unsigned) {}); };
766 [](json::Value& v, unsigned) { return v[
"value"].asInt(); },
769 [](
auto,
auto) { return 0; }}) == 5);
772 [](
auto&& v) {
return requires { v.visit(1, [](
json::Value&) {}); }; }(s1));
777 [](json::Value& v) { return v[
"value"].asInt(); },
779 [](
auto...) { return 0; }}) == 5);
781 [](
auto&& v) {
return requires { v.visit()(1, [](
json::Value&) {}); }; }(s1));
786 [](json::Value& v) { return v[
"value"].asInt(); },
788 [](
auto...) { return 0; }}) == 5);
790 static_assert([](
auto&& v) {
791 return requires { v.visit(1, [](
json::Value const&,
unsigned) {}); };
800 [](
auto,
auto) {
return 0; }}) == 3);
801 static_assert([](
auto&& v) {
802 return requires { v.visit()(1, [](
json::Value const&, unsigned) {}); };
811 [](
auto,
auto) {
return 0; }}) == 3);
813 static_assert([](
auto&& v) {
814 return requires { v.visit(1, [](
json::Value const&) {}); };
822 [](
auto...) {
return 0; }}) == 3);
823 static_assert([](
auto&& v) {
824 return requires { v.visit()(1, [](
json::Value const&) {}); };
832 [](
auto...) {
return 0; }}) == 3);
835 static_assert([](
auto&& v) {
839 static_assert([](
auto&& v) {
844 static_assert([](
auto&& v) {
847 static_assert([](
auto&& v) {
852 static_assert([](
auto&& v) {
856 static_assert([](
auto&& v) {
861 static_assert([](
auto&& v) {
864 static_assert([](
auto&& v) {
869 static_assert([](
auto&& v) {
874 static_assert([](
auto&& v) {
879 static_assert([](
auto&& v) {
884 static_assert([](
auto&& v) {
891 static_assert([](
auto&& v) {
896 static_assert([](
auto&& v) {
903 static_assert([](
auto&& v) {
906 static_assert([](
auto&& v) {
911 static_assert([](
auto&& v) {
914 static_assert([](
auto&& v) {