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