Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-15 10:26:43

0001 /// \file
0002 // Range v3 library
0003 //
0004 //  Copyright Eric Niebler 2013-present
0005 //
0006 //  Use, modification and distribution is subject to the
0007 //  Boost Software License, Version 1.0. (See accompanying
0008 //  file LICENSE_1_0.txt or copy at
0009 //  http://www.boost.org/LICENSE_1_0.txt)
0010 //
0011 // Project home: https://github.com/ericniebler/range-v3
0012 //
0013 
0014 #ifndef RANGES_V3_UTILITY_COMMON_TYPE_HPP
0015 #define RANGES_V3_UTILITY_COMMON_TYPE_HPP
0016 
0017 #include <tuple>
0018 #include <utility>
0019 
0020 #include <meta/meta.hpp>
0021 
0022 #include <concepts/type_traits.hpp>
0023 
0024 #include <range/v3/range_fwd.hpp>
0025 
0026 #include <range/v3/detail/prologue.hpp>
0027 
0028 // Sadly, this is necessary because of:
0029 //  - std::common_type is !SFINAE-friendly, and
0030 //  - The specification of std::common_type makes it impossibly
0031 //    difficult to specialize on user-defined types without spamming
0032 //    out a bajillion copies to handle all combinations of cv and ref
0033 //    qualifiers.
0034 
0035 namespace ranges
0036 {
0037     template<typename... Ts>
0038     using common_type = concepts::common_type<Ts...>;
0039 
0040     template<typename... Ts>
0041     using common_type_t = concepts::common_type_t<Ts...>;
0042 
0043     template<typename... Ts>
0044     using common_reference = concepts::common_reference<Ts...>;
0045 
0046     template<typename... Ts>
0047     using common_reference_t = concepts::common_reference_t<Ts...>;
0048 
0049     /// \cond
0050     template<typename F, typename S>
0051     struct common_pair;
0052 
0053     template<typename... Ts>
0054     struct common_tuple;
0055     /// \endcond
0056 } // namespace ranges
0057 
0058 /// \cond
0059 // Specializations for pair and tuple
0060 namespace concepts
0061 {
0062     // common_type for std::pairs
0063     template<typename F1, typename S1, typename F2, typename S2>
0064     struct common_type<std::pair<F1, S1>, ::ranges::common_pair<F2, S2>>;
0065 
0066     template<typename F1, typename S1, typename F2, typename S2>
0067     struct common_type<::ranges::common_pair<F1, S1>, std::pair<F2, S2>>;
0068 
0069     template<typename F1, typename S1, typename F2, typename S2>
0070     struct common_type<::ranges::common_pair<F1, S1>, ::ranges::common_pair<F2, S2>>;
0071 
0072     // common_type for std::tuples
0073     template<typename... Ts, typename... Us>
0074     struct common_type<::ranges::common_tuple<Ts...>, std::tuple<Us...>>;
0075 
0076     template<typename... Ts, typename... Us>
0077     struct common_type<std::tuple<Ts...>, ::ranges::common_tuple<Us...>>;
0078 
0079     template<typename... Ts, typename... Us>
0080     struct common_type<::ranges::common_tuple<Ts...>, ::ranges::common_tuple<Us...>>;
0081 
0082     // A common reference for std::pairs
0083     template<typename F1, typename S1, typename F2, typename S2,
0084              template<typename> class Qual1, template<typename> class Qual2>
0085     struct basic_common_reference<::ranges::common_pair<F1, S1>, std::pair<F2, S2>, Qual1, Qual2>;
0086 
0087     template<typename F1, typename S1, typename F2, typename S2,
0088              template<typename> class Qual1, template<typename> class Qual2>
0089     struct basic_common_reference<std::pair<F1, S1>, ::ranges::common_pair<F2, S2>, Qual1, Qual2>;
0090 
0091     template<typename F1, typename S1, typename F2, typename S2,
0092              template<typename> class Qual1, template<typename> class Qual2>
0093     struct basic_common_reference<::ranges::common_pair<F1, S1>, ::ranges::common_pair<F2, S2>, Qual1, Qual2>;
0094 
0095     // A common reference for std::tuples
0096     template<typename... Ts, typename... Us, template<typename> class Qual1,
0097              template<typename> class Qual2>
0098     struct basic_common_reference<::ranges::common_tuple<Ts...>, std::tuple<Us...>, Qual1, Qual2>;
0099 
0100     template<typename... Ts, typename... Us, template<typename> class Qual1,
0101              template<typename> class Qual2>
0102     struct basic_common_reference<std::tuple<Ts...>, ::ranges::common_tuple<Us...>, Qual1, Qual2>;
0103 
0104     template<typename... Ts, typename... Us, template<typename> class Qual1,
0105              template<typename> class Qual2>
0106     struct basic_common_reference<::ranges::common_tuple<Ts...>, ::ranges::common_tuple<Us...>, Qual1, Qual2>;
0107 } // namespace concepts
0108 
0109 #if RANGES_CXX_VER > RANGES_CXX_STD_17
0110 RANGES_DIAGNOSTIC_PUSH
0111 RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
0112 RANGES_BEGIN_NAMESPACE_STD
0113 RANGES_BEGIN_NAMESPACE_VERSION
0114 
0115     template<typename...>
0116     struct common_type;
0117 
0118     // common_type for std::pairs
0119     template<typename F1, typename S1, typename F2, typename S2>
0120     struct common_type<std::pair<F1, S1>, ::ranges::common_pair<F2, S2>>;
0121 
0122     template<typename F1, typename S1, typename F2, typename S2>
0123     struct common_type<::ranges::common_pair<F1, S1>, std::pair<F2, S2>>;
0124 
0125     template<typename F1, typename S1, typename F2, typename S2>
0126     struct common_type<::ranges::common_pair<F1, S1>, ::ranges::common_pair<F2, S2>>;
0127 
0128     // common_type for std::tuples
0129     template<typename... Ts, typename... Us>
0130     struct common_type<::ranges::common_tuple<Ts...>, std::tuple<Us...>>;
0131 
0132     template<typename... Ts, typename... Us>
0133     struct common_type<std::tuple<Ts...>, ::ranges::common_tuple<Us...>>;
0134 
0135     template<typename... Ts, typename... Us>
0136     struct common_type<::ranges::common_tuple<Ts...>, ::ranges::common_tuple<Us...>>;
0137 
0138     template<typename, typename, template<typename> class, template<typename> class>
0139     struct basic_common_reference;
0140 
0141     // A common reference for std::pairs
0142     template<typename F1, typename S1, typename F2, typename S2,
0143              template<typename> class Qual1, template<typename> class Qual2>
0144     struct basic_common_reference<::ranges::common_pair<F1, S1>, std::pair<F2, S2>, Qual1, Qual2>;
0145 
0146     template<typename F1, typename S1, typename F2, typename S2,
0147              template<typename> class Qual1, template<typename> class Qual2>
0148     struct basic_common_reference<std::pair<F1, S1>, ::ranges::common_pair<F2, S2>, Qual1, Qual2>;
0149 
0150     template<typename F1, typename S1, typename F2, typename S2,
0151              template<typename> class Qual1, template<typename> class Qual2>
0152     struct basic_common_reference<::ranges::common_pair<F1, S1>, ::ranges::common_pair<F2, S2>, Qual1, Qual2>;
0153 
0154     // A common reference for std::tuples
0155     template<typename... Ts, typename... Us, template<typename> class Qual1,
0156              template<typename> class Qual2>
0157     struct basic_common_reference<::ranges::common_tuple<Ts...>, std::tuple<Us...>, Qual1, Qual2>;
0158 
0159     template<typename... Ts, typename... Us, template<typename> class Qual1,
0160              template<typename> class Qual2>
0161     struct basic_common_reference<std::tuple<Ts...>, ::ranges::common_tuple<Us...>, Qual1, Qual2>;
0162 
0163     template<typename... Ts, typename... Us, template<typename> class Qual1,
0164              template<typename> class Qual2>
0165     struct basic_common_reference<::ranges::common_tuple<Ts...>, ::ranges::common_tuple<Us...>, Qual1, Qual2>;
0166 
0167 RANGES_END_NAMESPACE_VERSION
0168 RANGES_END_NAMESPACE_STD
0169 RANGES_DIAGNOSTIC_POP
0170 #endif // RANGES_CXX_VER > RANGES_CXX_STD_17
0171 /// \endcond
0172 
0173 #include <range/v3/detail/epilogue.hpp>
0174 
0175 #endif