Home | History | Annotate | Download | only in decpp
      1 #ifndef _DEDEFS_HPP
      2 #define _DEDEFS_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements C++ Base Library
      5  * -----------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Basic definitions.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "deDefs.h"
     27 
     28 #if !defined(__cplusplus)
     29 #	error "C++ is required"
     30 #endif
     31 
     32 namespace de
     33 {
     34 
     35 //!< Compute absolute value of x.
     36 template<typename T> inline T		abs			(T x)			{ return x < T(0) ? -x : x; }
     37 
     38 //!< Get minimum of x and y.
     39 template<typename T> inline T		min			(T x, T y)		{ return x <= y ? x : y; }
     40 
     41 //!< Get maximum of x and y.
     42 template<typename T> inline T		max			(T x, T y)		{ return x >= y ? x : y; }
     43 
     44 //!< Clamp x in range a <= x <= b.
     45 template<typename T> inline T		clamp		(T x, T a, T b)	{ DE_ASSERT(a <= b); return x < a ? a : (x > b ? b : x); }
     46 
     47 //!< Test if x is in bounds a <= x < b.
     48 template<typename T> inline bool	inBounds	(T x, T a, T b)	{ return a <= x && x < b; }
     49 
     50 //!< Test if x is in range a <= x <= b.
     51 template<typename T> inline bool	inRange		(T x, T a, T b)	{ return a <= x && x <= b; }
     52 
     53 //! Helper for DE_CHECK() macros.
     54 void throwRuntimeError (const char* message, const char* expr, const char* file, int line);
     55 
     56 //! Default deleter.
     57 template<typename T> struct DefaultDeleter
     58 {
     59 	inline DefaultDeleter (void) {}
     60 	template<typename U> inline DefaultDeleter (const DefaultDeleter<U>&) {}
     61 	template<typename U> inline DefaultDeleter<T>& operator= (const DefaultDeleter<U>&) { return *this; }
     62 	inline void operator() (T* ptr) const { delete ptr;	}
     63 };
     64 
     65 //! A deleter for arrays
     66 template<typename T> struct ArrayDeleter
     67 {
     68 	inline ArrayDeleter (void) {}
     69 	template<typename U> inline ArrayDeleter (const ArrayDeleter<U>&) {}
     70 	template<typename U> inline ArrayDeleter<T>& operator= (const ArrayDeleter<U>&) { return *this; }
     71 	inline void operator() (T* ptr) const { delete[] ptr; }
     72 };
     73 
     74 } // de
     75 
     76 /*--------------------------------------------------------------------*//*!
     77  * \brief Throw runtime error if condition is not met.
     78  * \param X		Condition to check.
     79  *
     80  * This macro throws std::runtime_error if condition X is not met.
     81  *//*--------------------------------------------------------------------*/
     82 #define DE_CHECK_RUNTIME_ERR(X)				do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) ::de::throwRuntimeError(DE_NULL, #X, __FILE__, __LINE__); } while(deGetFalse())
     83 
     84 /*--------------------------------------------------------------------*//*!
     85  * \brief Throw runtime error if condition is not met.
     86  * \param X		Condition to check.
     87  * \param MSG	Additional message to include in the exception.
     88  *
     89  * This macro throws std::runtime_error with message MSG if condition X is
     90  * not met.
     91  *//*--------------------------------------------------------------------*/
     92 #define DE_CHECK_RUNTIME_ERR_MSG(X, MSG)	do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) ::de::throwRuntimeError(MSG, #X, __FILE__, __LINE__); } while(deGetFalse())
     93 
     94 //! Get array start pointer.
     95 #define DE_ARRAY_BEGIN(ARR) (&(ARR)[0])
     96 
     97 //! Get array end pointer.
     98 #define DE_ARRAY_END(ARR)	(DE_ARRAY_BEGIN(ARR) + DE_LENGTH_OF_ARRAY(ARR))
     99 
    100 //! Empty C++ compilation unit silencing.
    101 #if (DE_COMPILER == DE_COMPILER_MSC)
    102 #	define DE_EMPTY_CPP_FILE namespace { deUint8 unused; }
    103 #else
    104 #	define DE_EMPTY_CPP_FILE
    105 #endif
    106 
    107 // Warn if type is constructed, but left unused
    108 //
    109 // Used in types with non-trivial ctor/dtor but with ctor-dtor pair causing no (observable)
    110 // side-effects.
    111 //
    112 // \todo add attribute for GCC
    113 #if (DE_COMPILER == DE_COMPILER_CLANG) && defined(__has_attribute)
    114 #	if __has_attribute(warn_unused)
    115 #		define DE_WARN_UNUSED_TYPE __attribute__((warn_unused))
    116 #	else
    117 #		define DE_WARN_UNUSED_TYPE
    118 #	endif
    119 #else
    120 #	define DE_WARN_UNUSED_TYPE
    121 #endif
    122 
    123 #endif // _DEDEFS_HPP
    124