STK++ 0.9.13
STK_StaticAssert.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright (C) 2004-2016 Serge Iovleff, Université Lille 1, Inria
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program; if not, write to the
16 Free Software Foundation, Inc.,
17 59 Temple Place,
18 Suite 330,
19 Boston, MA 02111-1307
20 USA
21
22 Contact : S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
23*/
24
25/*
26 * Project: stkpp::Sdk
27 * created on: 9 oct. 2012
28 * Author: iovleff, S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
29 **/
30
37#ifndef STK_STATICASSERT_H
38#define STK_STATICASSERT_H
39
40#define STK_SINGLE_ARG2(A,B) A,B
41#define STK_SINGLE_ARG3(A,B,C) A,B,C
42#define STK_SINGLE_ARG4(A,B,C,D) A,B,C,D
43#define STK_SINGLE_ARG5(A,B,C,D,E) A,B,C,D,E
44
45#if(__cplusplus < 201103L) // use old way
46
47namespace STK
48{
49
50template<bool condition> struct StaticAssert {};
51// if the condition is false the compiler will complain it does not find the message
52template<> struct StaticAssert<false> {};
53template<> struct StaticAssert<true>
54{
55 enum
56 {
57 YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX=0,
58 YOU_TRIED_CALLING_A_MATRIX_METHOD_ON_A_VECTOR=0,
59 YOU_TRIED_CALLING_A_POINT_METHOD_ON_SOMETHING_ELSE=0,
60 YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_SOMETHING_ELSE=0,
61 YOU_TRIED_CALLING_A_DENSE_METHOD_ON_SPARSE_STORAGE=0,
62 YOU_TRIED_TO_CONSTRUCT_A_REFERENCE_WITH_A_DIFFERENT_ORIENTATION=0,
63 YOU_TRIED_TO_CONSTRUCT_A_SQUAREMATRIX_WITH_DIFFERENT_DIMENSIONS=0,
64 YOU_TRIED_TO_CONSTRUCT_A_VECTOR_WITH_MORE_THAN_ONE_COLUM=0,
65 YOU_TRIED_TO_CONSTRUCT_A_POINT_WITH_MORE_THAN_ONE_ROW=0,
66 YOU_TRIED_TO_CONSTRUCT_A_SCALAR_WITH_MORE_THAN_ONE_ROW_OR_ONE_COLUMN=0,
67 YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_ROWS_SIZE=0,
68 YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_COLS_SIZE=0,
69 YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_BETWEEN_NOT_COMPATIBLE_ARRAYS=0,
70 YOU_TRIED_TO_ASSIGN_A_NOT_COMPATIBLE_ARRAY=0,
71 YOU_TRIED_TO_APPLY_A_METHOD_BETWEEN_NOT_COMPATIBLE_ARRAYS=0,
72 YOU_TRIED_TO_APPLY_A_PRODUCT_OPERATOR_BETWEEN_NOT_COMPATIBLE_ARRAYS=0,
73 YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_DIMENSIONS_SIZE=0,
74 YOU_TRIED_TO_WRAP_A_CONTAINER_WITH_THE_WRONG_TYPE_AS_A_VARIABLE=0,
75 YOU_TRIED_TO_WRAP_A_CONTAINER_WHICH_IS_NOT_1D_AS_A_VARIABLE=0,
76 YOU_TRIED_TO_USE_A_UNIDIMENSIONAL_METHOD_ON_A_MATRIX=0,
77 YOU_CANNOT_USED_AN_UNIDIMENSIONAL_METHOD_ON_THIS_OBJECT=0,
78 YOU_CANNOT_USED_A_ZERODIMENSIONAL_METHOD_ON_THIS_OBJECT=0,
79 YOU_CANNOT_USED_THIS_TYPE_OF_DATA_WITH_THIS_OBJECT=0,
80 YOU_CANNOT_USED_THIS_METHOD_WITH_THIS_KIND_OF_ARRAY=0,
81 YOU_HAVE_TO_USE_TWO_ARRAYS_WITH_THE_SAME_ORIENTATION=0,
82 YOU_HAVE_TO_USE_A_VECTOR_OR_POINT_IN_THIS_METHOD=0,
83 YOU_HAVE_TO_USE_A_SQUARE_MATRIX_IN_THIS_METHOD=0,
84 YOU_HAVE_TO_USE_A_MATRIX_OR_SQUARE_MATRIX_IN_THIS_METHOD=0,
85 INVALID_VECTOR_VECTOR_PRODUCT=0,
86 INVALID_POINT_POINT_PRODUCT=0
87 };
88};
89
90} // namespace STK
91
92//#ifndef IS_RTKPP_LIB
93//#pragma GCC diagnostic ignored "-Wint-in-bool-context"
94//#endif
95#define STK_STATIC_ASSERT(COND,MSG) \
96if (STK::StaticAssert<COND>::MSG) {}
97
98#else /* C++11 */
99
100// if native static_assert is enabled, let's use it
101#include <type_traits>
102#define STK_STATIC_ASSERT(COND,MSG) static_assert(bool(COND),#MSG);
103
104#endif // C++11
105
106#define STK_STATIC_ASSERT_SAME_ORIENTATION(COND) \
107 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_CONSTRUCT_A_REFERENCE_WITH_A_DIFFERENT_ORIENTATION)
108
109#define STK_STATIC_ASSERT_DIMENSIONS_MISMATCH(COND) \
110 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_METHOD_BETWEEN_NOT_COMPATIBLE_ARRAYS)
111
112#define STK_STATIC_ASSERT_SQUARE_SIZES_MISMATCH(COND) \
113 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_CONSTRUCT_A_SQUAREMATRIX_WITH_DIFFERENT_DIMENSIONS)
114
115#define STK_STATIC_ASSERT_VECTOR_SIZECOLS_MISMATCH(COND) \
116 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_CONSTRUCT_A_VECTOR_WITH_MORE_THAN_ONE_COLUM)
117
118#define STK_STATIC_ASSERT_POINT_SIZEROWS_MISMATCH(COND) \
119 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_CONSTRUCT_A_POINT_WITH_MORE_THAN_ONE_ROW)
120
121#define STK_STATIC_ASSERT_SCALAR_SIZE_MISMATCH(COND) \
122 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_CONSTRUCT_A_SCALAR_WITH_MORE_THAN_ONE_ROW_OR_ONE_COLUMN)
123
124#define STK_STATIC_ASSERT_ROWS_DIMENSIONS_MISMATCH(COND) \
125 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_ROWS_SIZE)
126
127#define STK_STATIC_ASSERT_COLS_DIMENSIONS_MISMATCH(COND) \
128 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_COLS_SIZE)
129
130#define STK_STATIC_ASSERT_BINARY_OPERATOR_DIMENSIONS_MISMATCH(COND) \
131 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_WITH_WRONG_DIMENSIONS_SIZE)
132
133#define STK_STATIC_ASSERT_BINARY_OPERATOR_MISMATCH(COND) \
134 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_BINARY_OPERATOR_BETWEEN_NOT_COMPATIBLE_ARRAYS)
135
136#define STK_STATIC_ASSERT_PRODUCT_OPERATOR_MISMATCH(COND) \
137 STK_STATIC_ASSERT(COND,YOU_TRIED_TO_APPLY_A_PRODUCT_OPERATOR_BETWEEN_NOT_COMPATIBLE_ARRAYS)
138
139#define STK_STATIC_ASSERT_TWO_DIMENSIONS_ONLY(EXPR) \
140STK_STATIC_ASSERT( ((int(hidden::Traits<EXPR>::structure_)==(int)Arrays::array2D_)) \
141 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::square_) \
142 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::diagonal_) \
143 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::number_) \
144 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::lower_triangular_) \
145 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::upper_triangular_) \
146 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::symmetric_) \
147 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::lower_symmetric_) \
148 ||(int(hidden::Traits<EXPR>::structure_)==(int)Arrays::upper_symmetric_) \
149 ,YOU_TRIED_CALLING_A_MATRIX_METHOD_ON_A_VECTOR)
150
151#define STK_STATIC_ASSERT_ONE_DIMENSION_ONLY(EXPR) \
152STK_STATIC_ASSERT( ( int(hidden::Traits<EXPR>::structure_) == int(Arrays::vector_)) \
153 ||( int(hidden::Traits<EXPR>::structure_) == int(Arrays::point_)) \
154 ||( int(hidden::Traits<EXPR>::structure_) == int(Arrays::diagonal_)) \
155 ||( int(hidden::Traits<EXPR>::structure_) == int(Arrays::number_)) \
156 ,YOU_CANNOT_USED_AN_UNIDIMENSIONAL_METHOD_ON_THIS_OBJECT)
157
158#define STK_STATIC_ASSERT_SAME_ORIENT(LHS, RHS) \
159STK_STATIC_ASSERT( int(hidden::Traits<LHS>::structure_)== int(hidden::Traits<RHS>::structure_) \
160 ,YOU_HAVE_TO_USE_TWO_ARRAYS_WITH_THE_SAME_ORIENTATION)
161
162#define STK_STATIC_ASSERT_DENSE_ONLY(EXPR) \
163STK_STATIC_ASSERT( int(hidden::Traits<EXPR>::storage_) == int(Arrays::dense_) \
164 ,YOU_TRIED_CALLING_A_DENSE_METHOD_ON_SPARSE_STORAGE)
165
166#define STK_STATIC_ASSERT_POINT_ONLY(EXPR) \
167STK_STATIC_ASSERT( int(hidden::Traits<EXPR>::structure_) == int(Arrays::point_) \
168 ,YOU_TRIED_CALLING_A_POINT_METHOD_ON_SOMETHING_ELSE)
169
170#define STK_STATIC_ASSERT_VECTOR_ONLY(EXPR) \
171STK_STATIC_ASSERT( int(hidden::Traits<EXPR>::structure_) == int(Arrays::vector_) \
172 ,YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_SOMETHING_ELSE)
173
174#define STK_STATIC_ASSERT_POINT_OR_VECTOR_ONLY(EXPR) \
175STK_STATIC_ASSERT( STK_SINGLE_ARG2(hidden::IsEqual< int(hidden::Traits<EXPR>::structure_), int(Arrays::vector_)>::value_) \
176 ||STK_SINGLE_ARG2(hidden::IsEqual< int(hidden::Traits<EXPR>::structure_), int(Arrays::point_)>::value_) \
177 ,YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_SOMETHING_ELSE)
178
179#define STK_STATIC_ASSERT_ZERO_DIMENSION_ONLY(EXPR) \
180STK_STATIC_ASSERT(STK_SINGLE_ARG2(hidden::IsEqual< int(hidden::Traits<EXPR>::structure_), int(Arrays::number_)>::value_) \
181 ,YOU_CANNOT_USED_A_ZERODIMENSIONAL_METHOD_ON_THIS_OBJECT)
182
183#endif /* STK_STATICASSERT_H */
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
The namespace STK is the main domain space of the Statistical ToolKit project.