GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
lo-traits.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2009-2013 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #if !defined (octave_lo_traits_h)
24 #define octave_lo_traits_h 1
25 
26 // Ideas for these classes taken from C++ Templates, The Complete
27 // Guide by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley
28 // (2003).
29 
30 // Select a type based on the value of a constant expression.
31 
32 template <bool cond, typename T1, typename T2>
33 class if_then_else;
34 
35 template<typename T1, typename T2>
36 class if_then_else<true, T1, T2>
37 {
38 public:
39 
40  typedef T1 result;
41 };
42 
43 template<typename T1, typename T2>
44 class if_then_else<false, T1, T2>
45 {
46 public:
47 
48  typedef T2 result;
49 };
50 
51 // Determine whether two types are equal.
52 template <class T1, class T2>
54 {
55 public:
56 
57  static const bool value = false;
58 };
59 
60 template <class T>
61 class equal_types <T, T>
62 {
63 public:
64 
65  static const bool value = true;
66 };
67 
68 // Determine whether a type is an instance of a template.
69 
70 template <template <class> class Template, class T>
72 {
73 public:
74 
75  static const bool value = false;
76 };
77 
78 template <template <class> class Template, class T>
79 class is_instance <Template, Template<T> >
80 {
81 public:
82 
83  static const bool value = true;
84 };
85 
86 // Determine whether a template paramter is a class type.
87 
88 template<typename T1>
90 {
91 private:
92 
93  typedef char one;
94  typedef struct { char c[2]; } two;
95 
96  // Classes can have pointers to members.
97  template<typename T2> static one is_class_type_test (int T2::*);
98 
99  // Catch everything else.
100  template<typename T2> static two is_class_type_test (...);
101 
102 public:
103 
104  enum { yes = sizeof (is_class_type_test<T1> (0)) == 1 };
105  enum { no = ! yes };
106 };
107 
108 // Define typename ref_param<T>::type as T const& if T is a class
109 // type. Otherwise, define it to be T.
110 
111 template<typename T>
113 {
114 public:
115 
116  typedef typename if_then_else<is_class_type<T>::no, T, T const&>::result type;
117 };
118 
119 // Will turn TemplatedClass<T> to T, leave T otherwise.
120 // Useful for stripping wrapper classes, like octave_int.
121 
122 template<template<typename> class TemplatedClass, typename T>
124 {
125 public:
126  typedef T type;
127 };
128 
129 template<template<typename> class TemplatedClass, typename T>
130 class strip_template_param<TemplatedClass, TemplatedClass<T> >
131 {
132 public:
133  typedef T type;
134 };
135 
136 // Will turn TemplatedClass<T> to TemplatedClass<S>, T to S otherwise.
137 // Useful for generic promotions.
138 
139 template<template<typename> class TemplatedClass, typename T, typename S>
141 {
142 public:
143  typedef S type;
144 };
145 
146 template<template<typename> class TemplatedClass, typename T, typename S>
147 class subst_template_param<TemplatedClass, TemplatedClass<T>, S>
148 {
149 public:
150  typedef TemplatedClass<S> type;
151 };
152 
153 #endif