diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 9b059178..62bfcb90 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -17,7 +17,7 @@ jobs: { cxx: $(brew --prefix llvm@15)/bin/clang++, pkgs: llvm@15 gcc@11, - extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@11)/include/c++/11 -cxx-isystem $(brew --prefix gcc@11)/include/c++/11/aarch64-apple-darwin23", + extra-flags: "-femulated-tls -stdlib=libstdc++ -stdlib++-isystem $(brew --prefix gcc@11)/include/c++/11 -cxx-isystem $(brew --prefix gcc@11)/include/c++/11/aarch64-apple-darwin23 -fsanitize=address -g -fno-omit-frame-pointer", linker-flags: "-L$(brew --prefix gcc@11)/lib/gcc/11" } ] diff --git a/src/utility/rng.hpp b/src/utility/rng.hpp index 7fa8a378..843820a3 100644 --- a/src/utility/rng.hpp +++ b/src/utility/rng.hpp @@ -29,6 +29,8 @@ #include #include +#include + #ifndef GAPP_SEED # define GAPP_SEED 0x3da99432ab975d26LL @@ -457,6 +459,8 @@ namespace gapp::rng template GAPP_NOINLINE small_vector sampleUniqueSet(IntType lbound, IntType ubound, size_t count) { + std::cout << "sampleUniqueSet\n"; + std::unordered_set selected(count); small_vector numbers(count); @@ -477,13 +481,20 @@ namespace gapp::rng { const size_t range_len = detail::range_length(lbound, ubound); + std::cout << "Sample unique lbound: " << lbound << ", ubound: " << ubound << ", count: " << count << "\n"; + GAPP_ASSERT(ubound >= lbound); GAPP_ASSERT(range_len >= count); - const bool select_many = (count > 0.6 * range_len); - const bool huge_range = (range_len >= 65536); + const bool select_many = std::cmp_greater_equal(count, size_t(0.6 * range_len)); + const bool huge_range = std::cmp_greater_equal(range_len, 65536); - if (huge_range) [[unlikely]] return rng::sampleUniqueSet(lbound, ubound, count); + std::cout << "Range len: " << range_len << ", huge_range: " << huge_range << "\n"; + std::cout << "select many: " << select_many << "\n"; + + if (huge_range) return rng::sampleUniqueSet(lbound, ubound, count); + + std::cout << "Sample unique small\n"; small_vector numbers(count); @@ -491,6 +502,8 @@ namespace gapp::rng is_selected.resize(range_len); is_selected.fill(select_many); + std::cout << "Allocated\n"; + if (!select_many) { IntType limit = ubound - detail::promoted_t(count); diff --git a/src/utility/small_vector.hpp b/src/utility/small_vector.hpp index 60decf5a..6a88e67f 100644 --- a/src/utility/small_vector.hpp +++ b/src/utility/small_vector.hpp @@ -302,18 +302,15 @@ namespace gapp::detail struct small_vector_buffer { public: - constexpr small_vector_buffer() noexcept {}; // NOLINT(*default) - constexpr ~small_vector_buffer() noexcept {}; // NOLINT(*default) + auto begin() noexcept { return reinterpret_cast(data_); } + auto begin() const noexcept { return reinterpret_cast(data_); } - constexpr auto begin() noexcept { return std::begin(data_); } - constexpr auto begin() const noexcept { return std::begin(data_); } + auto end() noexcept { return begin() + Size; } + auto end() const noexcept { return begin() + Size; } - constexpr auto end() noexcept { return std::end(data_); } - constexpr auto end() const noexcept { return std::end(data_); } - - constexpr std::size_t size() const noexcept { return std::size(data_); } + constexpr std::size_t size() const noexcept { return Size; } private: - union { char dummy_ = {}; T data_[Size]; }; // NOLINT(*arrays) + alignas(T) unsigned char data_[Size * sizeof(T)]; // NOLINT(*arrays) }; @@ -890,9 +887,6 @@ namespace gapp } private: - static constexpr std::size_t alignment = std::max(alignof(T), detail::cache_line_size); - - alignas(alignment) GAPP_NO_UNIQUE_ADDRESS detail::small_vector_buffer buffer_; pointer first_ = nullptr; pointer last_ = nullptr; diff --git a/test/unit/small_vector.cpp b/test/unit/small_vector.cpp index eac5e696..55210221 100644 --- a/test/unit/small_vector.cpp +++ b/test/unit/small_vector.cpp @@ -97,7 +97,6 @@ TEST_CASE("small_vector_size", "[object_layout][!mayfail]") // fails under clang STATIC_REQUIRE(std::is_standard_layout_v>); CHECK(sizeof(small_vector) == detail::cache_line_size); - CHECK(alignof(small_vector) == detail::cache_line_size); }