Mercurial > octave-nkf
annotate liboctave/util/lo-traits.h @ 20651:e54ecb33727e
lo-array-gripes.cc: Remove FIXME's related to buffer size.
* lo-array-gripes.cc: Remove FIXME's related to buffer size. Shorten sprintf
buffers from 100 to 64 characters (still well more than 19 required).
Use 'const' decorator on constant value for clarity. Remove extra space
between variable and array bracket.
author | Rik <rik@octave.org> |
---|---|
date | Mon, 12 Oct 2015 21:13:47 -0700 |
parents | 4197fc428c7d |
children |
rev | line source |
---|---|
8725 | 1 /* |
2 | |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17822
diff
changeset
|
3 Copyright (C) 2009-2015 John W. Eaton |
8725 | 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 | |
17822
ebb3ef964372
maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
23 #if !defined (octave_lo_traits_h) |
ebb3ef964372
maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
24 #define octave_lo_traits_h 1 |
8725 | 25 |
8726
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
26 // Ideas for these classes taken from C++ Templates, The Complete |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
27 // Guide by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
28 // (2003). |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
29 |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
30 // Select a type based on the value of a constant expression. |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
31 |
8725 | 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 | |
9721
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
51 // Determine whether two types are equal. |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
52 template <class T1, class T2> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
53 class equal_types |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
54 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
55 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
56 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
57 static const bool value = false; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
58 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
59 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
60 template <class T> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
61 class equal_types <T, T> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
62 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
63 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
64 |
10758
f3892d8eea9f
optimize horzcat/vertcat for scalars, cells and structs
Jaroslav Hajek <highegg@gmail.com>
parents:
10158
diff
changeset
|
65 static const bool value = true; |
9721
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
66 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
67 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
68 // Determine whether a type is an instance of a template. |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
69 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
70 template <template <class> class Template, class T> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
71 class is_instance |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
72 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
73 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
74 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
75 static const bool value = false; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
76 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
77 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
78 template <template <class> class Template, class T> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
79 class is_instance <Template, Template<T> > |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
80 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
81 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
82 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
83 static const bool value = true; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
84 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
85 |
8726
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
86 // Determine whether a template paramter is a class type. |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
87 |
8725 | 88 template<typename T1> |
89 class is_class_type | |
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 | |
8726
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
108 // Define typename ref_param<T>::type as T const& if T is a class |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
109 // type. Otherwise, define it to be T. |
0f6683a8150a
some comments for lo-traits.h
John W. Eaton <jwe@octave.org>
parents:
8725
diff
changeset
|
110 |
8725 | 111 template<typename T> |
112 class ref_param | |
113 { | |
114 public: | |
115 | |
116 typedef typename if_then_else<is_class_type<T>::no, T, T const&>::result type; | |
117 }; | |
118 | |
9685 | 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> | |
123 class strip_template_param | |
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 | |
9721
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
136 // Will turn TemplatedClass<T> to TemplatedClass<S>, T to S otherwise. |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
137 // Useful for generic promotions. |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
138 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
139 template<template<typename> class TemplatedClass, typename T, typename S> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
140 class subst_template_param |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
141 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
142 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
143 typedef S type; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
144 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
145 |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
146 template<template<typename> class TemplatedClass, typename T, typename S> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
147 class subst_template_param<TemplatedClass, TemplatedClass<T>, S> |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
148 { |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
149 public: |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
150 typedef TemplatedClass<S> type; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
151 }; |
192d94cff6c1
improve sum & implement the 'extra' option, refactor some code
Jaroslav Hajek <highegg@gmail.com>
parents:
9685
diff
changeset
|
152 |
8725 | 153 #endif |