1/* 2 * Copyright 2014, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Based on TypeOp in "C++-Templates, The Complete Guide", which is 6 * Copyright 2003 by Pearson Education, Inc. 7 */ 8#ifndef _TYPE_OPERATION_H 9#define _TYPE_OPERATION_H 10 11namespace BPrivate { 12 13 14// Generic type conversion operations. 15template<typename T> 16class TypeOperation { 17public: 18 typedef T ArgT; 19 typedef T BareT; 20 typedef T const ConstT; 21 22 typedef T& RefT; 23 typedef T& BareRefT; 24 typedef T const& ConstRefT; 25}; 26 27 28// Specialization for constant types. 29template<typename T> 30class TypeOperation<T const> { 31public: 32 typedef T const ArgT; 33 typedef T BareT; 34 typedef T const ConstT; 35 36 typedef T const& RefT; 37 typedef T& BareRefT; 38 typedef T const& ConstRefT; 39}; 40 41 42// Specialization for reference types. 43template<typename T> 44class TypeOperation<T&> { 45public: 46 typedef T& ArgT; 47 typedef typename TypeOperation<T>::BareT BareT; 48 typedef T const ConstT; 49 50 typedef T& RefT; 51 typedef typename TypeOperation<T>::BareRefT BareRefT; 52 typedef T const& ConstRefT; 53}; 54 55 56// Specialization for void. 57template<> 58class TypeOperation<void> { 59public: 60 typedef void ArgT; 61 typedef void BareT; 62 typedef void const ConstT; 63 64 typedef void RefT; 65 typedef void BareRefT; 66 typedef void ConstRefT; 67}; 68 69 70} // namespace BPrivate 71 72 73using BPrivate::TypeOperation; 74 75 76#endif // _TYPE_OPERATION_H 77