#pragma once #include "concepts/value_marker.h" #include #include namespace NFlatHash { namespace NSet { template struct TStaticValueMarker { using value_type = decltype(Value); constexpr auto Create() const noexcept { return Value; } template bool Equals(const U& rhs) const { return Value == rhs; } }; static_assert(NConcepts::ValueMarkerV>); template class TEqValueMarker { public: using value_type = T; template >>> TEqValueMarker(V&& v) : Value_(std::forward(v)) {} TEqValueMarker(const TEqValueMarker&) = default; TEqValueMarker(TEqValueMarker&&) = default; TEqValueMarker& operator=(const TEqValueMarker&) = default; TEqValueMarker& operator=(TEqValueMarker&&) = default; const T& Create() const noexcept { return Value_; } template bool Equals(const U& rhs) const { return Value_ == rhs; } private: T Value_; }; static_assert(NConcepts::ValueMarkerV>); } // namespace NSet namespace NMap { template class TStaticValueMarker { static_assert(std::is_default_constructible_v); public: using value_type = std::pair; TStaticValueMarker() = default; TStaticValueMarker(const TStaticValueMarker&) {} TStaticValueMarker(TStaticValueMarker&&) {} TStaticValueMarker& operator=(const TStaticValueMarker&) noexcept { return *this; } TStaticValueMarker& operator=(TStaticValueMarker&&) noexcept { return *this; } std::pair Create() const noexcept { return { Key, Value_ }; } template bool Equals(const U& rhs) const { return Key == rhs.first; } private: T Value_; }; static_assert(NConcepts::ValueMarkerV>); template class TEqValueMarker { static_assert(std::is_default_constructible_v); public: using value_type = std::pair; template >>> TEqValueMarker(V&& v) : Key_(std::forward(v)) {} TEqValueMarker(const TEqValueMarker& vm) : Key_(vm.Key_) {} TEqValueMarker(TEqValueMarker&& vm) noexcept(std::is_nothrow_move_constructible_v && std::is_nothrow_constructible_v) : Key_(std::move(vm.Key_)) {} TEqValueMarker& operator=(const TEqValueMarker& vm) { Key_ = vm.Key_; return *this; } TEqValueMarker& operator=(TEqValueMarker&& vm) noexcept(std::is_nothrow_move_assignable_v) { Key_ = std::move(vm.Key_); return *this; } auto Create() const noexcept { return std::tie(Key_, Value_); } template bool Equals(const U& rhs) const { return Key_ == rhs.first; } private: Key Key_; T Value_; }; static_assert(NConcepts::ValueMarkerV>); } // namespace NMap } // namespace NFlatHash