pelib
2.0.0
|
00001 /* 00002 Copyright 2015 Nicolas Melot 00003 00004 This file is part of Pelib. 00005 00006 Pelib is free software: you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation, either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 Pelib is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with Pelib. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00020 00021 #ifndef PELIB_CONSTRAINT 00022 #define PELIB_CONSTRAINT 00023 00025 template<class T, class B> struct Derived_from { 00026 static void constraints(T* p) { B* pb __attribute__((unused)); pb = p;} 00027 Derived_from() { void(*p)(T*) __attribute__((unused)); p = constraints; } 00028 }; 00029 00031 template<class T1, class T2> struct Can_copy { 00032 static void constraints(T1 a, T2 b) { T2 c = a; b = a; } 00033 Can_copy() { void(*p)(T1,T2) = constraints; } 00034 }; 00035 00037 template<class T1, class T2 = T1> struct Can_compare { 00038 static void constraints(T1 a, T2 b) { a==b; a!=b; a<b; } 00039 Can_compare() { void(*p)(T1,T2) = constraints; } 00040 }; 00041 00043 template<class T1, class T2, class T3 = T1> struct Can_multiply { 00044 static void constraints(T1 a, T2 b, T3 c) { c = a*b; } 00045 Can_multiply() { void(*p)(T1,T2,T3) = constraints; } 00046 }; 00047 00048 #endif