// Copyright 2018 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Generates random values for testing. Specialized only for the few types we // care about. #ifndef ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_ #define ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_ #include #include #include #include #include #include #include #include "absl/container/internal/hash_policy_testing.h" #include "absl/memory/memory.h" #include "absl/meta/type_traits.h" #include "absl/strings/string_view.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { namespace hash_internal { namespace generator_internal { template struct IsMap : std::false_type {}; template struct IsMap> : std::true_type {}; } // namespace generator_internal std::mt19937_64* GetSharedRng(); enum Enum { kEnumEmpty, kEnumDeleted, }; enum class EnumClass : uint64_t { kEmpty, kDeleted, }; inline std::ostream& operator<<(std::ostream& o, const EnumClass& ec) { return o << static_cast(ec); } template struct Generator; template struct Generator::value>::type> { T operator()() const { std::uniform_int_distribution dist; return dist(*GetSharedRng()); } }; template <> struct Generator { Enum operator()() const { std::uniform_int_distribution::type> dist; while (true) { auto variate = dist(*GetSharedRng()); if (variate != kEnumEmpty && variate != kEnumDeleted) return static_cast(variate); } } }; template <> struct Generator { EnumClass operator()() const { std::uniform_int_distribution< typename std::underlying_type::type> dist; while (true) { EnumClass variate = static_cast(dist(*GetSharedRng())); if (variate != EnumClass::kEmpty && variate != EnumClass::kDeleted) return static_cast(variate); } } }; template <> struct Generator { std::string operator()() const; }; template <> struct Generator { absl::string_view operator()() const; }; template <> struct Generator { NonStandardLayout operator()() const { return NonStandardLayout(Generator()()); } }; template struct Generator> { std::pair operator()() const { return std::pair(Generator::type>()(), Generator::type>()()); } }; template struct Generator> { std::tuple operator()() const { return std::tuple(Generator::type>()()...); } }; template struct Generator> { std::unique_ptr operator()() const { return absl::make_unique(Generator()()); } }; template struct Generator().key()), decltype(std::declval().value())>> : Generator().key())>::type, typename std::decay().value())>::type>> {}; template using GeneratedType = decltype( std::declval::value, typename Container::value_type, typename Container::key_type>::type>&>()()); } // namespace hash_internal } // namespace container_internal ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_