@@ -268,27 +268,8 @@ Software.
268268#include < stdexcept> // for length_error
269269#include < type_traits> // for aligned_storage and all meta-functions
270270
271- // Optimizer allowed to assume that EXPR evaluates to true
272- #define __IV_ASSUME (__EXPR ) \
273- static_cast <void >((__EXPR) ? void (0 ) : builtin_unreachable)
274-
275- // Assert pretty printer
276- #define __IV_ASSERT (...) \
277- static_cast <void >((__VA_ARGS__) \
278- ? void (0 ) \
279- : ::beman::details::inplace_vector::__assert_failure( \
280- static_cast <const char *>(__FILE__), __LINE__, \
281- " assertion failed: " #__VA_ARGS__))
282-
283- // Assert in debug, assume in release.
284- // #ifdef NDEBUG
285- // #define __IV_EXPECT(__EXPR) __IV_ASSUME(__EXPR)
286- // #else
287- // #define __IV_EXPECT(__EXPR) __IV_ASSERT(__EXPR)
288- // #endif
289-
290- // TODO River: Disabled temporarily
291- #define __IV_EXPECT (__EXPR )
271+ // Artifact from previous implementation, can be used as hints for optimizer
272+ #define IV_EXPECT (EXPR )
292273
293274// beman::from_range_t
294275namespace beman {
@@ -299,18 +280,6 @@ inline constexpr from_range_t from_range;
299280// Private utilities
300281namespace beman ::details::inplace_vector {
301282
302- template <class = void >
303- [[noreturn]]
304- static constexpr void __assert_failure (char const *file, int __line,
305- char const *__msg) {
306- if (std::is_constant_evaluated ()) {
307- throw __msg; // TODO: std lib implementer, do better here
308- } else {
309- std::fprintf (stderr, " %s(%d): %s\n " , file, __line, __msg);
310- std::abort ();
311- }
312- }
313-
314283using namespace beman ::details::inplace_vector;
315284
316285// clang-format off
@@ -329,7 +298,7 @@ template <std::ranges::random_access_range Rng, std::integral Index>
329298static constexpr decltype (auto ) index(Rng &&rng, Index i) noexcept
330299 requires(std::ranges::sized_range<Rng>)
331300{
332- __IV_EXPECT (static_cast <ptrdiff_t >(i) < std::ranges::size (rng));
301+ IV_EXPECT (static_cast <ptrdiff_t >(i) < std::ranges::size (rng));
333302 return std::begin (std::forward<Rng>(rng))[std::forward<Index>(i)];
334303}
335304
@@ -351,8 +320,8 @@ template <class T> struct zero_sized {
351320 static constexpr T *storage_data () noexcept { return nullptr ; }
352321 static constexpr size_type storage_size () noexcept { return 0 ; }
353322 static constexpr void unsafe_set_size (size_t new_size) noexcept {
354- __IV_EXPECT (new_size == 0 &&
355- " tried to change size of empty storage to non-zero value" );
323+ IV_EXPECT (new_size == 0 &&
324+ " tried to change size of empty storage to non-zero value" );
356325 }
357326
358327public:
@@ -388,7 +357,7 @@ template <class T, size_t N> struct trivial {
388357 constexpr T *storage_data () noexcept { return storage_data_.data (); }
389358 constexpr size_type storage_size () const noexcept { return storage_size_; }
390359 constexpr void unsafe_set_size (size_t new_size) noexcept {
391- __IV_EXPECT (size_type (new_size) <= N && " new_size out-of-bounds [0, N]" );
360+ IV_EXPECT (size_type (new_size) <= N && " new_size out-of-bounds [0, N]" );
392361 storage_size_ = size_type (new_size);
393362 }
394363
@@ -404,11 +373,11 @@ template <class T, size_t N> struct trivial {
404373template <class T , size_t N> struct raw_byte_based_storage {
405374 alignas (T) std::byte _d[sizeof (T) * N];
406375 constexpr T *storage_data (size_t i) noexcept {
407- __IV_EXPECT (i < N);
376+ IV_EXPECT (i < N);
408377 return reinterpret_cast <T *>(_d) + i;
409378 }
410379 constexpr const T *storage_data (size_t i) const noexcept {
411- __IV_EXPECT (i < N);
380+ IV_EXPECT (i < N);
412381 return reinterpret_cast <const T *>(_d) + i;
413382 }
414383};
@@ -436,7 +405,7 @@ template <class T, size_t N> struct non_trivial {
436405 constexpr T *storage_data () noexcept { return storage_data_.storage_data (0 ); }
437406 constexpr size_type storage_size () const noexcept { return storage_size_; }
438407 constexpr void unsafe_set_size (size_t new_size) noexcept {
439- __IV_EXPECT (size_type (new_size) <= N && " new_size out-of-bounds [0, N)" );
408+ IV_EXPECT (size_type (new_size) <= N && " new_size out-of-bounds [0, N)" );
440409 storage_size_ = size_type (new_size);
441410 }
442411
@@ -641,12 +610,12 @@ struct inplace_vector
641610
642611private: // Utilities
643612 constexpr void assert_iterator_in_range (const_iterator it) noexcept {
644- __IV_EXPECT (begin () <= it && " iterator not in range" );
645- __IV_EXPECT (it <= end () && " iterator not in range" );
613+ IV_EXPECT (begin () <= it && " iterator not in range" );
614+ IV_EXPECT (it <= end () && " iterator not in range" );
646615 }
647616 constexpr void assert_valid_iterator_pair (const_iterator first,
648617 const_iterator last) noexcept {
649- __IV_EXPECT (first <= last && " invalid iterator pair" );
618+ IV_EXPECT (first <= last && " invalid iterator pair" );
650619 }
651620 constexpr void assert_iterator_pair_in_range (const_iterator first,
652621 const_iterator last) noexcept {
@@ -673,7 +642,7 @@ struct inplace_vector
673642 constexpr T &unchecked_emplace_back (Args &&...args)
674643 requires(std::constructible_from<T, Args...>)
675644 {
676- __IV_EXPECT (size () < capacity () && " inplace_vector out-of-memory" );
645+ IV_EXPECT (size () < capacity () && " inplace_vector out-of-memory" );
677646 std::construct_at (end (), std::forward<Args>(args)...);
678647 unsafe_set_size (size () + size_type (1 ));
679648 return back ();
@@ -918,7 +887,7 @@ struct inplace_vector
918887 }
919888
920889 constexpr void pop_back () {
921- __IV_EXPECT (size () > 0 && " pop_back from empty inplace_vector!" );
890+ IV_EXPECT (size () > 0 && " pop_back from empty inplace_vector!" );
922891 unsafe_destroy (end () - 1 , end ());
923892 unsafe_set_size (size () - 1 );
924893 }
@@ -1052,7 +1021,4 @@ struct inplace_vector
10521021
10531022} // namespace beman
10541023
1055- // undefine all the internal macros
1056- #undef __IV_ASSUME
1057- #undef __IV_ASSERT
1058- #undef __IV_EXPECT
1024+ #undef IV_EXPECT
0 commit comments