1 /* -*- C++ -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 4 * 5 * Copyright (C) 2003-2008 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). 8 * 9 * Permission to use, modify and distribute this software is granted 10 * provided that this copyright notice appears in all copies. For 11 * precise terms see the accompanying LICENSE file. 12 * 13 * This software is provided "AS IS" with no warranty of any kind, 14 * express or implied, and with no claim as to its suitability for any 15 * purpose. 16 * 17 */ 18 19 // This file contains a modified version of the enable_if library from BOOST. 20 // See the appropriate copyright notice below. 21 22 // Boost enable_if library 23 24 // Copyright 2003 � The Trustees of Indiana University. 25 26 // Use, modification, and distribution is subject to the Boost Software 27 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 28 // http://www.boost.org/LICENSE_1_0.txt) 29 30 // Authors: Jaakko J�rvi (jajarvi at osl.iu.edu) 31 // Jeremiah Willcock (jewillco at osl.iu.edu) 32 // Andrew Lumsdaine (lums at osl.iu.edu) 33 34 35 #ifndef LEMON_BITS_UTILITY_H 36 #define LEMON_BITS_UTILITY_H 37 38 ///\file 39 ///\brief Miscellaneous basic utilities 40 /// 41 ///\todo Please rethink the organisation of the basic files like this. 42 ///E.g. this file might be merged with invalid.h. 43 44 45 namespace lemon 46 { 47 48 /// Basic type for defining "tags". A "YES" condition for \c enable_if. 49 50 /// Basic type for defining "tags". A "YES" condition for \c enable_if. 51 /// 52 ///\sa False 53 /// 54 /// \todo This should go to a separate "basic_types.h" (or something) 55 /// file. 56 struct True { 57 ///\e 58 static const bool value = true; 59 }; 60 61 /// Basic type for defining "tags". A "NO" condition for \c enable_if. 62 63 /// Basic type for defining "tags". A "NO" condition for \c enable_if. 64 /// 65 ///\sa True 66 struct False { 67 ///\e 68 static const bool value = false; 69 }; 70 71 72 struct InvalidType { 73 }; 74 75 template <typename T> 76 struct Wrap { 77 const T &value; WrapWrap78 Wrap(const T &t) : value(t) {} 79 }; 80 81 /**************** dummy class to avoid ambiguity ****************/ 82 dummydummy83 template<int T> struct dummy { dummy(int) {} }; 84 85 /**************** enable_if from BOOST ****************/ 86 87 template <typename Type, typename T = void> 88 struct exists { 89 typedef T type; 90 }; 91 92 93 template <bool B, class T = void> 94 struct enable_if_c { 95 typedef T type; 96 }; 97 98 template <class T> 99 struct enable_if_c<false, T> {}; 100 101 template <class Cond, class T = void> 102 struct enable_if : public enable_if_c<Cond::value, T> {}; 103 104 template <bool B, class T> 105 struct lazy_enable_if_c { 106 typedef typename T::type type; 107 }; 108 109 template <class T> 110 struct lazy_enable_if_c<false, T> {}; 111 112 template <class Cond, class T> 113 struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {}; 114 115 116 template <bool B, class T = void> 117 struct disable_if_c { 118 typedef T type; 119 }; 120 121 template <class T> 122 struct disable_if_c<true, T> {}; 123 124 template <class Cond, class T = void> 125 struct disable_if : public disable_if_c<Cond::value, T> {}; 126 127 template <bool B, class T> 128 struct lazy_disable_if_c { 129 typedef typename T::type type; 130 }; 131 132 template <class T> 133 struct lazy_disable_if_c<true, T> {}; 134 135 template <class Cond, class T> 136 struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {}; 137 138 } // namespace lemon 139 140 #endif 141