Skip to content

Commit

Permalink
Update rng.hpp
Browse files Browse the repository at this point in the history
  • Loading branch information
KRM7 committed Sep 16, 2024
1 parent a12b17a commit 064c818
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
]
Expand Down
19 changes: 16 additions & 3 deletions src/utility/rng.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#include <cstddef>
#include <concepts>

#include <iostream>


#ifndef GAPP_SEED
# define GAPP_SEED 0x3da99432ab975d26LL
Expand Down Expand Up @@ -457,6 +459,8 @@ namespace gapp::rng
template<std::integral IntType>
GAPP_NOINLINE small_vector<IntType> sampleUniqueSet(IntType lbound, IntType ubound, size_t count)
{
std::cout << "sampleUniqueSet\n";

std::unordered_set<IntType> selected(count);
small_vector<IntType> numbers(count);

Expand All @@ -477,20 +481,29 @@ 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<IntType> numbers(count);

thread_local detail::dynamic_bitset is_selected;
is_selected.resize(range_len);
is_selected.fill(select_many);

std::cout << "Allocated\n";

if (!select_many)
{
IntType limit = ubound - detail::promoted_t<IntType>(count);
Expand Down
18 changes: 7 additions & 11 deletions src/utility/small_vector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,18 +302,17 @@ namespace gapp::detail
struct small_vector_buffer
{
public:
constexpr small_vector_buffer() noexcept {}; // NOLINT(*default)
constexpr ~small_vector_buffer() noexcept {}; // NOLINT(*default)
small_vector_buffer() = default;

constexpr auto begin() noexcept { return std::begin(data_); }
constexpr auto begin() const noexcept { return std::begin(data_); }
auto begin() noexcept { return std::launder(reinterpret_cast<T*>(&data_)); }
auto begin() const noexcept { return std::launder(reinterpret_cast<const T*>(&data_)); }

constexpr auto end() noexcept { return std::end(data_); }
constexpr auto end() const noexcept { return std::end(data_); }
auto end() noexcept { return begin() + Size; }
auto end() const noexcept { return begin() + Size; }

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)
};


Expand Down Expand Up @@ -890,9 +889,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<T, Size> buffer_;
pointer first_ = nullptr;
pointer last_ = nullptr;
Expand Down
1 change: 0 additions & 1 deletion test/unit/small_vector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ TEST_CASE("small_vector_size", "[object_layout][!mayfail]") // fails under clang
STATIC_REQUIRE(std::is_standard_layout_v<small_vector<int>>);

CHECK(sizeof(small_vector<int>) == detail::cache_line_size);
CHECK(alignof(small_vector<int>) == detail::cache_line_size);
}


Expand Down

0 comments on commit 064c818

Please sign in to comment.