@@ -389,3 +389,50 @@ TEST_CASE("read enum (constrained size alias)", "[byterator]") {
389389 CHECK (i.readu8 <E2 >() == E2 ::A);
390390 CHECK ((i == j));
391391}
392+
393+ TEST_CASE (" advance to next alignment" , " [byterator]" ) {
394+ auto const a =
395+ std::array{stdx::to_be<std::uint64_t >(0x0102'0304'0506'0708 ),
396+ stdx::to_be<std::uint64_t >(0x0a0b'0c0d'0e0f'1011 )};
397+ auto base = stdx::byterator{std::begin (a)};
398+ auto i = stdx::byterator{std::begin (a)};
399+ i.advance_to_alignment ();
400+ CHECK (i == base);
401+
402+ ++i;
403+ i.advance_to_alignment ();
404+ CHECK (i == std::next (base));
405+
406+ i.advance_to_alignment <std::uint16_t >();
407+ CHECK (i == std::next (base, 2 ));
408+
409+ i.advance_to_alignment <std::uint32_t >();
410+ CHECK (i == std::next (base, 4 ));
411+
412+ i.advance_to_alignment <std::uint64_t >();
413+ CHECK (i == std::next (base, 8 ));
414+
415+ i.advance_to_alignment <std::uint64_t >(); // already there
416+ CHECK (i == std::next (base, 8 ));
417+ }
418+
419+ TEST_CASE (" advance to previous alignment" , " [byterator]" ) {
420+ auto const a =
421+ std::array{stdx::to_be<std::uint64_t >(0x0102'0304'0506'0708 ),
422+ stdx::to_be<std::uint64_t >(0x0a0b'0c0d'0e0f'1011 )};
423+ auto base = stdx::byterator{std::begin (a)};
424+ auto i = stdx::byterator{std::begin (a)};
425+
426+ i.advance (8 );
427+ i.advance_to_alignment (-1 );
428+ CHECK (i == std::next (base, 7 ));
429+
430+ i.advance_to_alignment <std::uint16_t >(-1 );
431+ CHECK (i == std::next (base, 6 ));
432+
433+ i.advance_to_alignment <std::uint32_t >(-1 );
434+ CHECK (i == std::next (base, 4 ));
435+
436+ i.advance_to_alignment <std::uint64_t >(-1 );
437+ CHECK (i == base);
438+ }
0 commit comments