You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
/* |
|
* Copyright (C) 2023 Riyyi |
|
* |
|
* SPDX-License-Identifier: MIT |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <utility> // std::forward |
|
|
|
#include "ruc/meta/odr.h" |
|
|
|
namespace blaze { |
|
|
|
namespace detail { |
|
|
|
// struct hashMapConstructor { |
|
// template<typename HashMap> |
|
// static void construct(HashMap& hash_map, bool boolean) |
|
// { |
|
// //.. |
|
// } |
|
// }; |
|
|
|
// template<typename HashMap, typename T> |
|
// void toHashMap(HashMap& hash_map, const T& value) |
|
// { |
|
// hashMapConstructor::construct(hash_map, value); |
|
// } |
|
|
|
struct toHashMapFunction { |
|
template<typename HashMapPtr, typename T> |
|
auto operator()(HashMapPtr& hash_map, T&& value) const |
|
{ |
|
return to_hash_map(hash_map, std::forward<T>(value)); |
|
} |
|
}; |
|
|
|
} // namespace detail |
|
|
|
// Anonymous namespace prevents multiple definition of the reference |
|
namespace { |
|
// Function object |
|
constexpr const auto& to_hash_map = ruc::detail::staticConst<detail::toHashMapFunction>; // NOLINT(misc-definitions-in-headers,clang-diagnostic-unused-variable) |
|
} // namespace |
|
|
|
} // namespace blaze |
|
|
|
// Customization Points |
|
// https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html |
|
|
|
// blaze::to_hash_map is a function object, the type of which is |
|
// blaze::detail::toHashMapFunction. In the blaze::detail namespace are the to_hash_map |
|
// free functions. The function call operator of toHashMapFunction makes an |
|
// unqualified call to to_hash_map which, since it shares the detail namespace with |
|
// the to_hash_map free functions, will consider those in addition to any overloads |
|
// that are found by argument-dependent lookup. |
|
|
|
// Variable templates are linked externally, therefor every translation unit |
|
// will see the same address for detail::staticConst<detail::toHashMapFunction>. |
|
// Since blaze::to_hash_map is a reference to the variable template, it too will have |
|
// the same address in all translation units.
|
|
|