blob: 3caf7baaf0566c7654b512a5f5c272c46598c138 [file] [log] [blame]
Jeff Thompsona28eed82013-08-22 16:21:10 -07001// Copyright (C) 2006 Arkadiy Vertleyb
2// Use, modification and distribution is subject to the Boost Software
3// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
4
5#ifndef BOOST_TYPEOF_NATIVE_HPP_INCLUDED
6#define BOOST_TYPEOF_NATIVE_HPP_INCLUDED
7
8#ifndef MSVC_TYPEOF_HACK
9
10#ifdef BOOST_NO_SFINAE
11
12namespace ndnboost { namespace type_of {
13
14 template<class T>
15 T& ensure_obj(const T&);
16
17}}
18
19#else
20
21#include <ndnboost/type_traits/is_function.hpp>
22#include <ndnboost/utility/enable_if.hpp>
23
24namespace ndnboost { namespace type_of {
25# ifdef BOOST_NO_SFINAE
26 template<class T>
27 T& ensure_obj(const T&);
28# else
29 template<typename T>
30 typename enable_if<is_function<T>, T&>::type
31 ensure_obj(T&);
32
33 template<typename T>
34 typename disable_if<is_function<T>, T&>::type
35 ensure_obj(const T&);
36# endif
37}}
38
39#endif//BOOST_NO_SFINAE
40
41#define BOOST_TYPEOF(expr) BOOST_TYPEOF_KEYWORD(ndnboost::type_of::ensure_obj(expr))
42#define BOOST_TYPEOF_TPL BOOST_TYPEOF
43
44#define BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr) \
45 struct name {\
46 typedef BOOST_TYPEOF_TPL(expr) type;\
47 };
48
49#define BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) \
50 struct name {\
51 typedef BOOST_TYPEOF(expr) type;\
52 };
53
54#endif//MSVC_TYPEOF_HACK
55
56#define BOOST_TYPEOF_REGISTER_TYPE(x)
57#define BOOST_TYPEOF_REGISTER_TEMPLATE(x, params)
58
59#endif//BOOST_TYPEOF_NATIVE_HPP_INCLUDED
60