#ifdef RYML_SINGLE_HEADER #include "ryml_all.hpp" #else #include "c4/yml/detail/stack.hpp" #endif #include #include "./callbacks_tester.hpp" //------------------------------------------- namespace c4 { namespace yml { namespace detail { template using istack = stack; using ip = int const*; template void to_large(istack *s) { size_t sz = 3u * N; s->reserve(sz); EXPECT_NE(s->m_stack, s->m_buf); } template void fill_to_large(istack *s) { size_t sz = 3u * N; s->reserve(sz); for(int i = 0, e = (int)sz; i < e; ++i) s->push(i); EXPECT_NE(s->m_stack, s->m_buf); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_stack_small_vs_large() { istack s; for(size_t i = 0; i < N; ++i) { s.push(static_cast(i)); EXPECT_EQ(s.size(), i+1); } EXPECT_EQ(s.size(), N); EXPECT_EQ(s.m_stack, s.m_buf); for(size_t i = 0; i < N; ++i) { EXPECT_EQ(s.top(N-1-i), static_cast(i)); } s.push(N); EXPECT_NE(s.m_stack, s.m_buf); EXPECT_EQ(s.top(), static_cast(N)); EXPECT_EQ(s.pop(), static_cast(N)); EXPECT_NE(s.m_stack, s.m_buf); for(size_t i = 0; i < N; ++i) { EXPECT_EQ(s.top(N-1-i), static_cast(i)); } } TEST(stack, small_vs_large) { test_stack_small_vs_large<8>(); test_stack_small_vs_large<16>(); test_stack_small_vs_large<32>(); test_stack_small_vs_large<128>(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_copy_ctor() { istack src; // small for(size_t i = 0; i < N; ++i) { src.push((int)i); } EXPECT_EQ(src.m_stack, src.m_buf); ip b = src.begin(); { istack dst(src); EXPECT_EQ(dst.size(), src.size()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ((ip)src.begin(), b); EXPECT_NE((ip)dst.begin(), (ip)src.begin()); } // large for(size_t i = 0; i < 2*N; ++i) { src.push((int)i); // large } EXPECT_NE(src.m_stack, src.m_buf); b = src.begin(); { istack dst(src); EXPECT_EQ(dst.size(), src.size()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ((ip)src.begin(), b); EXPECT_NE((ip)dst.begin(), (ip)src.begin()); } } TEST(stack, copy_ctor) { test_copy_ctor<4>(); test_copy_ctor<8>(); test_copy_ctor<64>(); test_copy_ctor<128>(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_move_ctor() { istack src; // small for(size_t i = 0; i < N; ++i) { src.push((int)i); } EXPECT_EQ(src.m_stack, src.m_buf); ip b = src.begin(); size_t sz = src.size(); { istack dst(std::move(src)); EXPECT_EQ(dst.size(), sz); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_NE(dst.m_stack, b); EXPECT_EQ(src.size(), size_t(0)); EXPECT_EQ((ip)src.begin(), src.m_buf); EXPECT_NE((ip)dst.begin(), b); } EXPECT_EQ(src.size(), size_t(0)); EXPECT_EQ(src.capacity(), N); EXPECT_EQ(src.m_stack, src.m_buf); // redo for(size_t i = 0; i < N; ++i) { src.push((int)i); } EXPECT_EQ(src.size(), N); EXPECT_EQ(src.capacity(), N); EXPECT_EQ(src.m_stack, src.m_buf); // large for(size_t i = 0; i < 2*N; ++i) { src.push((int)i); // large } EXPECT_EQ(src.size(), 3*N); EXPECT_NE(src.m_stack, src.m_buf); b = src.begin(); sz = src.size(); { istack dst(std::move(src)); EXPECT_EQ(dst.size(), sz); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(dst.m_stack, b); EXPECT_EQ(src.capacity(), N); EXPECT_EQ(src.size(), size_t(0)); EXPECT_EQ((ip)src.begin(), src.m_buf); EXPECT_EQ((ip)dst.begin(), b); } } TEST(stack, move_ctor) { test_move_ctor<4>(); test_move_ctor<8>(); test_move_ctor<64>(); test_move_ctor<128>(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_copy_assign() { istack dst; istack srcs; // small istack srcl; // large for(size_t i = 0; i < N; ++i) { srcs.push((int)i); // small srcl.push((int)i); // large } for(size_t i = 0; i < 2*N; ++i) { srcl.push((int)i); // large } EXPECT_EQ(srcs.m_stack, srcs.m_buf); EXPECT_NE(srcl.m_stack, srcl.m_buf); ip bs = srcs.begin(), bl = srcl.begin(); { dst = srcs; EXPECT_EQ(dst.size(), srcs.size()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ((ip)srcs.begin(), bs); EXPECT_NE((ip)dst.begin(), (ip)srcs.begin()); } { dst = srcl; EXPECT_EQ(dst.size(), srcl.size()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ((ip)srcl.begin(), bl); EXPECT_NE((ip)dst.begin(), (ip)srcl.begin()); } { dst = srcs; EXPECT_EQ(dst.size(), srcs.size()); EXPECT_NE(dst.m_stack, dst.m_buf); // it stays in long mode (it's not trimmed when assigned from a short-mode stack) EXPECT_EQ((ip)srcs.begin(), bs); EXPECT_NE((ip)dst.begin(), (ip)srcs.begin()); } } TEST(stack, copy_assign) { test_copy_assign<4>(); test_copy_assign<8>(); test_copy_assign<64>(); test_copy_assign<128>(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_move_assign() { istack srcs, srcl, dst; for(size_t i = 0; i < N; ++i) { srcs.push((int)i); // small srcl.push((int)i); // large } for(size_t i = 0; i < 2*N; ++i) { srcl.push((int)i); // large } EXPECT_EQ(srcs.m_stack, srcs.m_buf); EXPECT_NE(srcl.m_stack, srcl.m_buf); ip bs = srcs.begin()/*, bl = srcl.begin()*/; size_t szs = srcs.size(), szl = srcl.size(); for(int i = 0; i < 10; ++i) { EXPECT_FALSE(srcs.empty()); EXPECT_TRUE(dst.empty()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(srcs.m_stack, srcs.m_buf); dst = std::move(srcs); EXPECT_TRUE(srcs.empty()); EXPECT_FALSE(dst.empty()); EXPECT_EQ(srcs.size(), size_t(0)); EXPECT_EQ(srcs.capacity(), N); EXPECT_EQ(dst.size(), szs); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(srcs.m_stack, srcs.m_buf); EXPECT_EQ((ip)srcs.begin(), bs); EXPECT_NE((ip)dst.begin(), (ip)srcs.begin()); srcs = std::move(dst); } for(int i = 0; i < 10; ++i) { EXPECT_EQ(srcl.size(), 3*N); EXPECT_FALSE(srcl.empty()); EXPECT_TRUE(dst.empty()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_NE(srcl.m_stack, srcl.m_buf); dst = std::move(srcl); EXPECT_TRUE(srcl.empty()); EXPECT_FALSE(dst.empty()); EXPECT_EQ(srcl.size(), size_t(0)); EXPECT_EQ(srcl.capacity(), N); EXPECT_EQ(dst.size(), szl); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(srcl.m_stack, srcl.m_buf); EXPECT_EQ((ip)srcl.begin(), srcl.m_buf); EXPECT_NE((ip)dst.begin(), (ip)srcl.begin()); srcl = std::move(dst); } } TEST(stack, move_assign) { test_move_assign<4>(); test_move_assign<8>(); test_move_assign<64>(); test_move_assign<128>(); } //----------------------------------------------------------------------------- template void test_callbacks_default_ctor() { CallbacksTester td; CallbacksTester ts; istack dst; EXPECT_EQ(dst.m_callbacks, get_callbacks()); } TEST(stack, callbacks_default_ctor) { test_callbacks_default_ctor<4>(); test_callbacks_default_ctor<8>(); test_callbacks_default_ctor<64>(); test_callbacks_default_ctor<128>(); } template void test_callbacks_ctor() { CallbacksTester td; CallbacksTester ts; istack dst(td.callbacks()); ASSERT_EQ(dst.m_callbacks, td.callbacks()); } TEST(stack, callbacks_ctor) { test_callbacks_ctor<4>(); test_callbacks_ctor<8>(); test_callbacks_ctor<64>(); test_callbacks_ctor<128>(); } //----------------------------------------------------------------------------- // copy ctor template void test_callbacks_copy_ctor_small() { CallbacksTester ts("src"); CallbacksTester td("dst"); { istack src(ts.callbacks()); EXPECT_EQ(src.size(), 0u); EXPECT_EQ(src.capacity(), N); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); size_t nbefore = ts.num_allocs; EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); istack dst(src); EXPECT_EQ(dst.size(), 0u); EXPECT_EQ(dst.capacity(), N); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, nbefore); EXPECT_EQ(td.num_allocs, 0u); } } template void test_callbacks_copy_ctor_large_unfilled() { CallbacksTester ts("src"); CallbacksTester td("dst"); { istack src(ts.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); to_large(&src); ASSERT_GT(src.capacity(), N); size_t nbefore = ts.num_allocs; EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(ts.num_allocs, 0u); istack dst(src); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); ASSERT_NE(dst.m_callbacks, td.callbacks()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, nbefore); EXPECT_EQ(td.num_allocs, 0u); } } template void test_callbacks_copy_ctor_large_filled() { CallbacksTester ts("src"); CallbacksTester td("dst"); { istack src(ts.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); fill_to_large(&src); ASSERT_GT(src.capacity(), N); size_t nbefore = ts.num_allocs; EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(ts.num_allocs, 0u); istack dst(src); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); ASSERT_NE(dst.m_callbacks, td.callbacks()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_GT(ts.num_allocs, nbefore); EXPECT_EQ(td.num_allocs, 0u); } } TEST(stack, callbacks_copy_ctor_small) { test_callbacks_copy_ctor_small<4>(); test_callbacks_copy_ctor_small<8>(); test_callbacks_copy_ctor_small<64>(); test_callbacks_copy_ctor_small<128>(); } TEST(stack, callbacks_copy_ctor_large_unfilled) { test_callbacks_copy_ctor_large_unfilled<4>(); test_callbacks_copy_ctor_large_unfilled<8>(); test_callbacks_copy_ctor_large_unfilled<64>(); test_callbacks_copy_ctor_large_unfilled<128>(); } TEST(stack, callbacks_copy_ctor_large_filled) { test_callbacks_copy_ctor_large_filled<4>(); test_callbacks_copy_ctor_large_filled<8>(); test_callbacks_copy_ctor_large_filled<64>(); test_callbacks_copy_ctor_large_filled<128>(); } //----------------------------------------------------------------------------- // copy ctor template void test_callbacks_move_ctor_small() { CallbacksTester ts; istack src(ts.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); size_t nbefore = ts.num_allocs; EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); istack dst(std::move(src)); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, nbefore); } template void test_callbacks_move_ctor_large_unfilled() { CallbacksTester ts; istack src(ts.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); to_large(&src); size_t nbefore = ts.num_allocs; EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(ts.num_allocs, 0u); istack dst(std::move(src)); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, nbefore); } template void test_callbacks_move_ctor_large_filled() { CallbacksTester ts; istack src(ts.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); fill_to_large(&src); size_t nbefore = ts.num_allocs; EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(ts.num_allocs, 0u); istack dst(std::move(src)); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, nbefore); } TEST(stack, callbacks_move_ctor_small) { test_callbacks_move_ctor_small<4>(); test_callbacks_move_ctor_small<8>(); test_callbacks_move_ctor_small<64>(); test_callbacks_move_ctor_small<128>(); } TEST(stack, callbacks_move_ctor_large_unfilled) { test_callbacks_move_ctor_large_unfilled<4>(); test_callbacks_move_ctor_large_unfilled<8>(); test_callbacks_move_ctor_large_unfilled<64>(); test_callbacks_move_ctor_large_unfilled<128>(); } TEST(stack, callbacks_move_ctor_large_filled) { test_callbacks_move_ctor_large_filled<4>(); test_callbacks_move_ctor_large_filled<8>(); test_callbacks_move_ctor_large_filled<64>(); test_callbacks_move_ctor_large_filled<128>(); } //----------------------------------------------------------------------------- // copy assign template void test_callbacks_copy_assign_to_empty() { CallbacksTester ts("src"); CallbacksTester td("dst"); istack src(ts.callbacks()); istack dst(td.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); fill_to_large(&src); size_t nbefore = ts.num_allocs; EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(ts.num_allocs, 0u); dst = src; ASSERT_EQ(dst.m_callbacks, ts.callbacks()); ASSERT_NE(dst.m_callbacks, td.callbacks()); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_GT(ts.num_allocs, nbefore); EXPECT_EQ(td.num_allocs, 0u); } TEST(stack, callbacks_copy_assign_to_empty) { test_callbacks_copy_assign_to_empty<4>(); test_callbacks_copy_assign_to_empty<8>(); test_callbacks_copy_assign_to_empty<64>(); test_callbacks_copy_assign_to_empty<128>(); } template void test_callbacks_copy_assign_to_nonempty() { CallbacksTester ts("src"); { CallbacksTester td("dst"); istack src(ts.callbacks()); istack dst(td.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, td.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); EXPECT_EQ(td.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); fill_to_large(&src); fill_to_large(&dst); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(td.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); dst = src; ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); // changed to ts EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 2u); EXPECT_EQ(td.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 1u); td.check(); } ts.check(); } TEST(stack, callbacks_copy_assign_to_nonempty) { test_callbacks_copy_assign_to_nonempty<4>(); test_callbacks_copy_assign_to_nonempty<8>(); test_callbacks_copy_assign_to_nonempty<64>(); test_callbacks_copy_assign_to_nonempty<128>(); } template void test_callbacks_move_assign_to_empty() { CallbacksTester ts("src"); { CallbacksTester td("dst"); istack src(ts.callbacks()); istack dst(td.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, td.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(ts.num_allocs, 0u); EXPECT_EQ(td.num_allocs, 0u); fill_to_large(&src); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_EQ(dst.m_stack, dst.m_buf); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(td.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); dst = std::move(src); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); // changed to ts EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(td.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); td.check(); } EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 1u); ts.check(); } TEST(stack, callbacks_move_assign_to_empty) { test_callbacks_move_assign_to_empty<4>(); test_callbacks_move_assign_to_empty<8>(); test_callbacks_move_assign_to_empty<64>(); test_callbacks_move_assign_to_empty<128>(); } template void test_callbacks_move_assign_to_nonempty() { CallbacksTester ts("src"); { CallbacksTester td("dst"); istack src(ts.callbacks()); istack dst(td.callbacks()); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, td.callbacks()); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 0u); EXPECT_EQ(td.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); fill_to_large(&src); fill_to_large(&dst); EXPECT_NE(src.m_stack, src.m_buf); EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(td.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 0u); dst = std::move(src); ASSERT_EQ(src.m_callbacks, ts.callbacks()); ASSERT_EQ(dst.m_callbacks, ts.callbacks()); // changed to ts EXPECT_NE(dst.m_stack, dst.m_buf); EXPECT_EQ(src.m_stack, src.m_buf); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(td.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(td.num_deallocs, 1u); td.check(); } EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 1u); ts.check(); } TEST(stack, callbacks_move_assign_to_nonempty) { test_callbacks_move_assign_to_nonempty<4>(); test_callbacks_move_assign_to_nonempty<8>(); test_callbacks_move_assign_to_nonempty<64>(); test_callbacks_move_assign_to_nonempty<128>(); } //----------------------------------------------------------------------------- template void test_reserve() { { CallbacksTester ts; { istack s(ts.callbacks()); EXPECT_EQ(ts.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(s.capacity(), N); s.reserve(4*N); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(s.capacity(), 4*N); } EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 1u); ts.check(); } { CallbacksTester ts; { istack s(ts.callbacks()); EXPECT_EQ(ts.num_allocs, 0u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(s.capacity(), N); s.reserve(4*N); EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 0u); EXPECT_EQ(s.capacity(), 4*N); s._free(); } EXPECT_EQ(ts.num_allocs, 1u); EXPECT_EQ(ts.num_deallocs, 1u); ts.check(); } } TEST(stack, reserve_capacity) { test_reserve<10>(); test_reserve<20>(); } template void grow_to_large__push() { istack s; int ni = (int)N; for(int i = 0; i < NumTimes * ni; ++i) { s.push(i); if(i < ni) EXPECT_EQ(s.m_stack, s.m_buf) << i; else EXPECT_NE(s.m_stack, s.m_buf) << i; } for(int i = 0; i < NumTimes * ni; ++i) { EXPECT_EQ(s.bottom((size_t)i), i); } } TEST(stack, push_to_large_twice) { grow_to_large__push<10, 8>(); grow_to_large__push<20, 8>(); grow_to_large__push<32, 8>(); } template void grow_to_large__push_top() { istack s; int ni = (int)N; s.push(0); for(int i = 1; i < NumTimes * ni; ++i) { s.push_top(); EXPECT_EQ(s.top(), i-1) << i; s.top() = i; if(i < ni) EXPECT_EQ(s.m_stack, s.m_buf) << i; else EXPECT_NE(s.m_stack, s.m_buf) << i; } for(int i = 0; i < NumTimes * ni; ++i) { EXPECT_EQ(s.bottom((size_t)i), i); } } TEST(stack, push_top_to_large_twice) { grow_to_large__push_top<10, 8>(); grow_to_large__push_top<20, 8>(); grow_to_large__push_top<32, 8>(); } } // namespace detail } // namespace yml } // namespace c4 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // this is needed to use the test case library #ifndef RYML_SINGLE_HEADER #include "c4/substr.hpp" #endif namespace c4 { namespace yml { struct Case; Case const* get_case(csubstr /*name*/) { return nullptr; } } // namespace yml } // namespace c4