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 //! Get required memory alignment for type
     75 template<typename T>
     76 size_t alignOf (void)
     77 {
     78 	struct PaddingCheck { deUint8 b; T t; };
     79 	return (size_t)DE_OFFSET_OF(PaddingCheck, t);
     80 }
     81 
     82 } // de
     83 
     84 /*--------------------------------------------------------------------*//*!
     85  * \brief Throw runtime error if condition is not met.
     86  * \param X		Condition to check.
     87  *
     88  * This macro throws std::runtime_error if condition X is not met.
     89  *//*--------------------------------------------------------------------*/
     90 #define DE_CHECK_RUNTIME_ERR(X)				do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) ::de::throwRuntimeError(DE_NULL, #X, __FILE__, __LINE__); } while(deGetFalse())
     91 
     92 /*--------------------------------------------------------------------*//*!
     93  * \brief Throw runtime error if condition is not met.
     94  * \param X		Condition to check.
     95  * \param MSG	Additional message to include in the exception.
     96  *
     97  * This macro throws std::runtime_error with message MSG if condition X is
     98  * not met.
     99  *//*--------------------------------------------------------------------*/
    100 #define DE_CHECK_RUNTIME_ERR_MSG(X, MSG)	do { if ((!deGetFalse() && (X)) ? DE_FALSE : DE_TRUE) ::de::throwRuntimeError(MSG, #X, __FILE__, __LINE__); } while(deGetFalse())
    101 
    102 //! Get array start pointer.
    103 #define DE_ARRAY_BEGIN(ARR) (&(ARR)[0])
    104 
    105 //! Get array end pointer.
    106 #define DE_ARRAY_END(ARR)	(DE_ARRAY_BEGIN(ARR) + DE_LENGTH_OF_ARRAY(ARR))
    107 
    108 //! Empty C++ compilation unit silencing.
    109 #if (DE_COMPILER == DE_COMPILER_MSC)
    110 #	define DE_EMPTY_CPP_FILE namespace { deUint8 unused; }
    111 #else
    112 #	define DE_EMPTY_CPP_FILE
    113 #endif
    114 
    115 // Warn if type is constructed, but left unused
    116 //
    117 // Used in types with non-trivial ctor/dtor but with ctor-dtor pair causing no (observable)
    118 // side-effects.
    119 //
    120 // \todo add attribute for GCC
    121 #if (DE_COMPILER == DE_COMPILER_CLANG) && defined(__has_attribute)
    122 #	if __has_attribute(warn_unused)
    123 #		define DE_WARN_UNUSED_TYPE __attribute__((warn_unused))
    124 #	else
    125 #		define DE_WARN_UNUSED_TYPE
    126 #	endif
    127 #else
    128 #	define DE_WARN_UNUSED_TYPE
    129 #endif
    130 
    131 #endif // _DEDEFS_HPP
    132