Home | History | Annotate | Download | only in detail
      1 ///////////////////////////////////////////////////////////////////////////////////
      2 /// OpenGL Mathematics (glm.g-truc.net)
      3 ///
      4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
      5 /// Permission is hereby granted, free of charge, to any person obtaining a copy
      6 /// of this software and associated documentation files (the "Software"), to deal
      7 /// in the Software without restriction, including without limitation the rights
      8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 /// copies of the Software, and to permit persons to whom the Software is
     10 /// furnished to do so, subject to the following conditions:
     11 ///
     12 /// The above copyright notice and this permission notice shall be included in
     13 /// all copies or substantial portions of the Software.
     14 ///
     15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 /// THE SOFTWARE.
     22 ///
     23 /// @ref core
     24 /// @file glm/core/_features.hpp
     25 /// @date 2013-02-20 / 2013-02-20
     26 /// @author Christophe Riccio
     27 ///////////////////////////////////////////////////////////////////////////////////
     28 
     29 #ifndef glm_core_features
     30 #define glm_core_features
     31 
     32 // #define GLM_CXX98_EXCEPTIONS
     33 // #define GLM_CXX98_RTTI
     34 
     35 // #define GLM_CXX11_RVALUE_REFERENCES
     36 // Rvalue references - GCC 4.3
     37 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html
     38 
     39 // GLM_CXX11_TRAILING_RETURN
     40 // Rvalue references for *this - GCC not supported
     41 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm
     42 
     43 // GLM_CXX11_NONSTATIC_MEMBER_INIT
     44 // Initialization of class objects by rvalues - GCC any
     45 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html
     46 
     47 // GLM_CXX11_NONSTATIC_MEMBER_INIT
     48 // Non-static data member initializers - GCC 4.7
     49 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm
     50 
     51 // #define GLM_CXX11_VARIADIC_TEMPLATE
     52 // Variadic templates - GCC 4.3
     53 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf
     54 
     55 //
     56 // Extending variadic template template parameters - GCC 4.4
     57 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf
     58 
     59 // #define GLM_CXX11_GENERALIZED_INITIALIZERS
     60 // Initializer lists - GCC 4.4
     61 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm
     62 
     63 // #define GLM_CXX11_STATIC_ASSERT
     64 // Static assertions - GCC 4.3
     65 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html
     66 
     67 // #define GLM_CXX11_AUTO_TYPE
     68 // auto-typed variables - GCC 4.4
     69 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf
     70 
     71 // #define GLM_CXX11_AUTO_TYPE
     72 // Multi-declarator auto - GCC 4.4
     73 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf
     74 
     75 // #define GLM_CXX11_AUTO_TYPE
     76 // Removal of auto as a storage-class specifier - GCC 4.4
     77 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm
     78 
     79 // #define GLM_CXX11_AUTO_TYPE
     80 // New function declarator syntax - GCC 4.4
     81 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm
     82 
     83 // #define GLM_CXX11_LAMBDAS
     84 // New wording for C++0x lambdas - GCC 4.5
     85 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf
     86 
     87 // #define GLM_CXX11_DECLTYPE
     88 // Declared type of an expression - GCC 4.3
     89 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf
     90 
     91 //
     92 // Right angle brackets - GCC 4.3
     93 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
     94 
     95 //
     96 // Default template arguments for function templates	DR226	GCC 4.3
     97 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226
     98 
     99 //
    100 // Solving the SFINAE problem for expressions	DR339	GCC 4.4
    101 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html
    102 
    103 // #define GLM_CXX11_ALIAS_TEMPLATE
    104 // Template aliases	N2258	GCC 4.7
    105 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
    106 
    107 //
    108 // Extern templates	N1987	Yes
    109 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm
    110 
    111 // #define GLM_CXX11_NULLPTR
    112 // Null pointer constant	N2431	GCC 4.6
    113 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
    114 
    115 // #define GLM_CXX11_STRONG_ENUMS
    116 // Strongly-typed enums	N2347	GCC 4.4
    117 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
    118 
    119 //
    120 // Forward declarations for enums	N2764	GCC 4.6
    121 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
    122 
    123 //
    124 // Generalized attributes	N2761	GCC 4.8
    125 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf
    126 
    127 //
    128 // Generalized constant expressions	N2235	GCC 4.6
    129 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf
    130 
    131 //
    132 // Alignment support	N2341	GCC 4.8
    133 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf
    134 
    135 // #define GLM_CXX11_DELEGATING_CONSTRUCTORS
    136 // Delegating constructors	N1986	GCC 4.7
    137 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf
    138 
    139 //
    140 // Inheriting constructors	N2540	GCC 4.8
    141 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm
    142 
    143 // #define GLM_CXX11_EXPLICIT_CONVERSIONS
    144 // Explicit conversion operators	N2437	GCC 4.5
    145 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf
    146 
    147 //
    148 // New character types	N2249	GCC 4.4
    149 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html
    150 
    151 //
    152 // Unicode string literals	N2442	GCC 4.5
    153 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm
    154 
    155 //
    156 // Raw string literals	N2442	GCC 4.5
    157 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm
    158 
    159 //
    160 // Universal character name literals	N2170	GCC 4.5
    161 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html
    162 
    163 // #define GLM_CXX11_USER_LITERALS
    164 // User-defined literals		N2765	GCC 4.7
    165 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf
    166 
    167 //
    168 // Standard Layout Types	N2342	GCC 4.5
    169 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm
    170 
    171 // #define GLM_CXX11_DEFAULTED_FUNCTIONS
    172 // #define GLM_CXX11_DELETED_FUNCTIONS
    173 // Defaulted and deleted functions	N2346	GCC 4.4
    174 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm
    175 
    176 //
    177 // Extended friend declarations	N1791	GCC 4.7
    178 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf
    179 
    180 //
    181 // Extending sizeof	N2253	GCC 4.4
    182 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html
    183 
    184 // #define GLM_CXX11_INLINE_NAMESPACES
    185 // Inline namespaces	N2535	GCC 4.4
    186 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm
    187 
    188 // #define GLM_CXX11_UNRESTRICTED_UNIONS
    189 // Unrestricted unions	N2544	GCC 4.6
    190 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf
    191 
    192 // #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
    193 // Local and unnamed types as template arguments	N2657	GCC 4.5
    194 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm
    195 
    196 // #define GLM_CXX11_RANGE_FOR
    197 // Range-based for	N2930	GCC 4.6
    198 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html
    199 
    200 // #define GLM_CXX11_OVERRIDE_CONTROL
    201 // Explicit virtual overrides	N2928 N3206 N3272	GCC 4.7
    202 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm
    203 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm
    204 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm
    205 
    206 //
    207 // Minimal support for garbage collection and reachability-based leak detection	N2670	No
    208 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm
    209 
    210 // #define GLM_CXX11_NOEXCEPT
    211 // Allowing move constructors to throw [noexcept]	N3050	GCC 4.6 (core language only)
    212 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html
    213 
    214 //
    215 // Defining move special member functions	N3053	GCC 4.6
    216 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html
    217 
    218 //
    219 // Sequence points	N2239	Yes
    220 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html
    221 
    222 //
    223 // Atomic operations	N2427	GCC 4.4
    224 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html
    225 
    226 //
    227 // Strong Compare and Exchange	N2748	GCC 4.5
    228 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html
    229 
    230 //
    231 // Bidirectional Fences	N2752	GCC 4.8
    232 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm
    233 
    234 //
    235 // Memory model	N2429	GCC 4.8
    236 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm
    237 
    238 //
    239 // Data-dependency ordering: atomics and memory model	N2664	GCC 4.4
    240 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm
    241 
    242 //
    243 // Propagating exceptions	N2179	GCC 4.4
    244 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html
    245 
    246 //
    247 // Abandoning a process and at_quick_exit	N2440	GCC 4.8
    248 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm
    249 
    250 //
    251 // Allow atomics use in signal handlers	N2547	Yes
    252 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm
    253 
    254 //
    255 // Thread-local storage	N2659	GCC 4.8
    256 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm
    257 
    258 //
    259 // Dynamic initialization and destruction with concurrency	N2660	GCC 4.3
    260 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm
    261 
    262 //
    263 // __func__ predefined identifier	N2340	GCC 4.3
    264 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm
    265 
    266 //
    267 // C99 preprocessor	N1653	GCC 4.3
    268 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm
    269 
    270 //
    271 // long long	N1811	GCC 4.3
    272 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf
    273 
    274 //
    275 // Extended integral types	N1988	Yes
    276 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf
    277 
    278 #if(GLM_COMPILER & GLM_COMPILER_GCC)
    279 
    280 #	if(GLM_COMPILER >= GLM_COMPILER_GCC43)
    281 #		define GLM_CXX11_STATIC_ASSERT
    282 #	endif
    283 
    284 #elif(GLM_COMPILER & GLM_COMPILER_CLANG)
    285 #	if(__has_feature(cxx_exceptions))
    286 #		define GLM_CXX98_EXCEPTIONS
    287 #	endif
    288 
    289 #	if(__has_feature(cxx_rtti))
    290 #		define GLM_CXX98_RTTI
    291 #	endif
    292 
    293 #	if(__has_feature(cxx_access_control_sfinae))
    294 #		define GLM_CXX11_ACCESS_CONTROL_SFINAE
    295 #	endif
    296 
    297 #	if(__has_feature(cxx_alias_templates))
    298 #		define GLM_CXX11_ALIAS_TEMPLATE
    299 #	endif
    300 
    301 #	if(__has_feature(cxx_alignas))
    302 #		define GLM_CXX11_ALIGNAS
    303 #	endif
    304 
    305 #	if(__has_feature(cxx_attributes))
    306 #		define GLM_CXX11_ATTRIBUTES
    307 #	endif
    308 
    309 #	if(__has_feature(cxx_constexpr))
    310 #		define GLM_CXX11_CONSTEXPR
    311 #	endif
    312 
    313 #	if(__has_feature(cxx_decltype))
    314 #		define GLM_CXX11_DECLTYPE
    315 #	endif
    316 
    317 #	if(__has_feature(cxx_default_function_template_args))
    318 #		define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
    319 #	endif
    320 
    321 #	if(__has_feature(cxx_defaulted_functions))
    322 #		define GLM_CXX11_DEFAULTED_FUNCTIONS
    323 #	endif
    324 
    325 #	if(__has_feature(cxx_delegating_constructors))
    326 #		define GLM_CXX11_DELEGATING_CONSTRUCTORS
    327 #	endif
    328 
    329 #	if(__has_feature(cxx_deleted_functions))
    330 #		define GLM_CXX11_DELETED_FUNCTIONS
    331 #	endif
    332 
    333 #	if(__has_feature(cxx_explicit_conversions))
    334 #		define GLM_CXX11_EXPLICIT_CONVERSIONS
    335 #	endif
    336 
    337 #	if(__has_feature(cxx_generalized_initializers))
    338 #		define GLM_CXX11_GENERALIZED_INITIALIZERS
    339 #	endif
    340 
    341 #	if(__has_feature(cxx_implicit_moves))
    342 #		define GLM_CXX11_IMPLICIT_MOVES
    343 #	endif
    344 
    345 #	if(__has_feature(cxx_inheriting_constructors))
    346 #		define GLM_CXX11_INHERITING_CONSTRUCTORS
    347 #	endif
    348 
    349 #	if(__has_feature(cxx_inline_namespaces))
    350 #		define GLM_CXX11_INLINE_NAMESPACES
    351 #	endif
    352 
    353 #	if(__has_feature(cxx_lambdas))
    354 #		define GLM_CXX11_LAMBDAS
    355 #	endif
    356 
    357 #	if(__has_feature(cxx_local_type_template_args))
    358 #		define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
    359 #	endif
    360 
    361 #	if(__has_feature(cxx_noexcept))
    362 #		define GLM_CXX11_NOEXCEPT
    363 #	endif
    364 
    365 #	if(__has_feature(cxx_nonstatic_member_init))
    366 #		define GLM_CXX11_NONSTATIC_MEMBER_INIT
    367 #	endif
    368 
    369 #	if(__has_feature(cxx_nullptr))
    370 #		define GLM_CXX11_NULLPTR
    371 #	endif
    372 
    373 #	if(__has_feature(cxx_override_control))
    374 #		define GLM_CXX11_OVERRIDE_CONTROL
    375 #	endif
    376 
    377 #	if(__has_feature(cxx_reference_qualified_functions))
    378 #		define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
    379 #	endif
    380 
    381 #	if(__has_feature(cxx_range_for))
    382 #		define GLM_CXX11_RANGE_FOR
    383 #	endif
    384 
    385 #	if(__has_feature(cxx_raw_string_literals))
    386 #		define GLM_CXX11_RAW_STRING_LITERALS
    387 #	endif
    388 
    389 #	if(__has_feature(cxx_rvalue_references))
    390 #		define GLM_CXX11_RVALUE_REFERENCES
    391 #	endif
    392 
    393 #	if(__has_feature(cxx_static_assert))
    394 #		define GLM_CXX11_STATIC_ASSERT
    395 #	endif
    396 
    397 #	if(__has_feature(cxx_auto_type))
    398 #		define GLM_CXX11_AUTO_TYPE
    399 #	endif
    400 
    401 #	if(__has_feature(cxx_strong_enums))
    402 #		define GLM_CXX11_STRONG_ENUMS
    403 #	endif
    404 
    405 #	if(__has_feature(cxx_trailing_return))
    406 #		define GLM_CXX11_TRAILING_RETURN
    407 #	endif
    408 
    409 #	if(__has_feature(cxx_unicode_literals))
    410 #		define GLM_CXX11_UNICODE_LITERALS
    411 #	endif
    412 
    413 #	if(__has_feature(cxx_unrestricted_unions))
    414 #		define GLM_CXX11_UNRESTRICTED_UNIONS
    415 #	endif
    416 
    417 #	if(__has_feature(cxx_user_literals))
    418 #		define GLM_CXX11_USER_LITERALS
    419 #	endif
    420 
    421 #	if(__has_feature(cxx_variadic_templates))
    422 #		define GLM_CXX11_VARIADIC_TEMPLATES
    423 #	endif
    424 
    425 #endif//(GLM_COMPILER & GLM_COMPILER_CLANG)
    426 
    427 #endif//glm_core_features
    428