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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8725
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1 /*
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5 This file is part of Octave.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
6
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
10 option) any later version.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
11
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
15 for more details.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
16
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
20
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
21 */
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32 template <bool cond, typename T1, typename T2>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 class if_then_else;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 template<typename T1, typename T2>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36 class if_then_else<true, T1, T2>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 {
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38 public:
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 typedef T1 result;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41 };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
43 template<typename T1, typename T2>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
44 class if_then_else<false, T1, T2>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 {
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 public:
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
48 typedef T2 result;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49 };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
88 template<typename T1>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
89 class is_class_type
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
90 {
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
91 private:
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
92
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
93 typedef char one;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
94 typedef struct { char c[2]; } two;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
95
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
96 // Classes can have pointers to members.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
97 template<typename T2> static one is_class_type_test (int T2::*);
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
98
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
99 // Catch everything else.
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
100 template<typename T2> static two is_class_type_test (...);
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
101
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
102 public:
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
103
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
104 enum { yes = sizeof (is_class_type_test<T1> (0)) == 1 };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
105 enum { no = ! yes };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
106 };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
111 template<typename T>
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
112 class ref_param
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
113 {
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
114 public:
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
115
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
116 typedef typename if_then_else<is_class_type<T>::no, T, T const&>::result type;
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
117 };
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
118
9685
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
119 // Will turn TemplatedClass<T> to T, leave T otherwise.
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
120 // Useful for stripping wrapper classes, like octave_int.
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
121
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
122 template<template<typename> class TemplatedClass, typename T>
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
123 class strip_template_param
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
124 {
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
125 public:
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
126 typedef T type;
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
127 };
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
128
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
129 template<template<typename> class TemplatedClass, typename T>
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
130 class strip_template_param<TemplatedClass, TemplatedClass<T> >
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
131 {
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
132 public:
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
133 typedef T type;
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
134 };
e793865ede63 implement builtin_type
Jaroslav Hajek <highegg@gmail.com>
parents: 8726
diff changeset
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
d5af326a3ede [mq]: sort-traits
John W. Eaton <jwe@octave.org>
parents:
diff changeset
153 #endif