eval_if_default.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /*
  2. * Distributed under the Boost Software License, Version 1.0.
  3. * (See accompanying file LICENSE_1_0.txt or copy at
  4. * https://www.boost.org/LICENSE_1_0.txt)
  5. *
  6. * Copyright (c) 2025 Andrey Semashev
  7. */
  8. #ifndef BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_
  9. #define BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_
  10. #include <boost/core/use_default.hpp>
  11. #include <boost/iterator/detail/type_traits/type_identity.hpp>
  12. namespace boost {
  13. namespace iterators {
  14. namespace detail {
  15. // If T is use_default, return the result of invoking
  16. // DefaultNullaryFn, otherwise - of NondefaultNullaryFn.
  17. // By default, NondefaultNullaryFn returns T, which means
  18. // the metafunction can be called with just two parameters
  19. // and in that case will return either T or the result of
  20. // invoking DefaultNullaryFn.
  21. template< typename T, typename DefaultNullaryFn, typename NondefaultNullaryFn = detail::type_identity< T > >
  22. struct eval_if_default
  23. {
  24. using type = typename NondefaultNullaryFn::type;
  25. };
  26. template< typename DefaultNullaryFn, typename NondefaultNullaryFn >
  27. struct eval_if_default< use_default, DefaultNullaryFn, NondefaultNullaryFn >
  28. {
  29. using type = typename DefaultNullaryFn::type;
  30. };
  31. template< typename T, typename DefaultNullaryFn, typename NondefaultNullaryFn = detail::type_identity< T > >
  32. using eval_if_default_t = typename eval_if_default< T, DefaultNullaryFn, NondefaultNullaryFn >::type;
  33. } // namespace detail
  34. } // namespace iterators
  35. } // namespace boost
  36. #endif // BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_