/*!
 * \file    if.h
 * \brief   Template meta-programming conditional helpers
 *
 * Copyright (C) 2018 Christos Choutouridis
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef __utl_meta_if_h__
#define __utl_meta_if_h__

#include <utl/impl/version.h>


/*!
 * \ingroup meta
 * \defgroup if
 * conditional type support header
 */
//! @{
namespace utl {

   //! select _T1 or _T2 based on _C
   //! @{
   template <bool _C, typename _T1, typename _T2>
   struct select_ {
      typedef _T1 type;
   };

   template <typename _T1, typename _T2>
   struct select_ <false, _T1, _T2> {
      typedef _T2 type;
   };
   //! @}

   //! select _Tp if _C is true, else SFINAE
   //! @{
   template <bool _C, typename _Tp = void>
   struct if_ {
      typedef _Tp type;
   };
   template<typename _Tp>  // Partial specialization for false.
   struct if_ <false, _Tp> { };

   //! Alias template for if_
   template<bool _C, typename _Tp = void>
   using if_t = typename if_<_C, _Tp>::type;

   //! Publicly recognized alias template for if_
   template<bool _C, typename _Tp = void>
   using enable_if_t = typename if_<_C, _Tp>::type;
   //! @}
}

//! @}
#endif /* __utl_meta_if_h__ */