Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:27:56

0001 // Range v3 library
0002 //
0003 //  Copyright Eric Niebler 2013-present
0004 //
0005 //  Use, modification and distribution is subject to the
0006 //  Boost Software License, Version 1.0. (See accompanying
0007 //  file LICENSE_1_0.txt or copy at
0008 //  http://www.boost.org/LICENSE_1_0.txt)
0009 //
0010 // Project home: https://github.com/ericniebler/range-v3
0011 //
0012 #ifndef RANGES_V3_DETAIL_WITH_BRACED_INIT_ARGS_HPP
0013 #define RANGES_V3_DETAIL_WITH_BRACED_INIT_ARGS_HPP
0014 
0015 #include <initializer_list>
0016 
0017 #include <range/v3/functional/invoke.hpp>
0018 
0019 #include <range/v3/detail/prologue.hpp>
0020 
0021 namespace ranges
0022 {
0023     /// \cond
0024     namespace detail
0025     {
0026         // Accepts initializer_lists as either the first or second parameter, or both,
0027         // and forwards on to an implementation.
0028         template<typename ImplFn>
0029         struct with_braced_init_args : ImplFn
0030         {
0031         private:
0032             constexpr ImplFn const & base() const
0033             {
0034                 return *this;
0035             }
0036 
0037         public:
0038             using ImplFn::operator();
0039 
0040             template<typename V0, typename... Args>
0041             constexpr invoke_result_t<ImplFn const &, std::initializer_list<V0>, Args...>
0042             operator()(std::initializer_list<V0> && rng0, Args &&... args) const
0043             {
0044                 return base()(static_cast<std::initializer_list<V0> &&>(rng0),
0045                               static_cast<Args &&>(args)...);
0046             }
0047             /// \overload
0048             template<typename Rng0, typename V1, typename... Args>
0049             constexpr invoke_result_t<ImplFn const &,
0050                                       Rng0,
0051                                       std::initializer_list<V1>,
0052                                       Args...> //
0053             operator()(Rng0 && rng0, std::initializer_list<V1> && rng1, Args &&... args)
0054                 const
0055             {
0056                 return base()( //
0057                     static_cast<Rng0 &&>(rng0),
0058                     static_cast<std::initializer_list<V1> &&>(rng1),
0059                     static_cast<Args &&>(args)...);
0060             }
0061             /// \overload
0062             template<typename V0, typename V1, typename... Args>
0063             constexpr invoke_result_t<ImplFn const &,
0064                                       std::initializer_list<V0>,
0065                                       std::initializer_list<V1>,
0066                                       Args...>
0067             operator()(std::initializer_list<V0> && rng0,
0068                        std::initializer_list<V1> && rng1,
0069                        Args &&... args) const
0070             {
0071                 return base()( //
0072                     static_cast<std::initializer_list<V0> &&>(rng0),
0073                     static_cast<std::initializer_list<V1> &&>(rng1),
0074                     static_cast<Args &&>(args)...);
0075             }
0076         };
0077     } // namespace detail
0078     /// \endcond
0079 } // namespace ranges
0080 
0081 #include <range/v3/detail/epilogue.hpp>
0082 
0083 #endif