remove \r
[extl.git] / extl / type / null_type.h
blobe432b37fe5d0d97b44d6c599eabe7c16c54c4799
1 /* ///////////////////////////////////////////////////////////////////////
2 * File: null_type.h
4 * Created: 08.07.16
5 * Updated: 08.07.16
7 * Brief: The null type - as type placeholder instead of void type
9 * [<Home>]
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
12 #ifndef EXTL_TYPE_NULL_TYPE_H
13 #define EXTL_TYPE_NULL_TYPE_H
15 /* ///////////////////////////////////////////////////////////////////////
16 * Includes
18 #include "../config/config.h"
19 #include "typedef.h"
21 /* ///////////////////////////////////////////////////////////////////////
22 * ::extl namespace
24 EXTL_BEGIN_NAMESPACE
26 #ifdef __cplusplus
28 // forward declaration
29 struct null_type;
30 EXTL_INLINE null_type const& cnull();
32 // null_type
33 struct null_type
35 private:
36 // Prohibit generating an instance
37 null_type(){};
38 // Prohibit copy constructor
39 null_type(null_type const&);
40 // Prohibit assignment
41 null_type& operator =(null_type const&);
43 public:
44 /* Gets a const reference instance as ab placeholder
45 * e.g.
46 * void func(null_type const& p = cnull());
48 friend null_type const& cnull()
50 /* a helper function to provide a static const null_type instance */
51 static const null_type s_null_obj;
52 return s_null_obj;
56 // is_null_type traits
57 template < typename_param_k T >
58 struct is_null_type
60 EXTL_STATIC_MEMBER_CONST(e_bool_t, value = e_false_v);
63 EXTL_TEMPLATE_SPECIALISATION
64 struct is_null_type<null_type>
66 EXTL_STATIC_MEMBER_CONST(e_bool_t, value = e_true_v);
69 #else /* !__cplusplus */
71 typedef struct null_type_tag{} null_type;
72 /* a helper function to provide a const null_type type temporary */
73 EXTL_INLINE const null_type cnull() { return null_type(); }
75 #endif /* __cplusplus */
77 /* e_null_t */
78 typedef null_type e_null_t;
80 /* ///////////////////////////////////////////////////////////////////////
81 * ::extl namespace
83 EXTL_END_NAMESPACE
85 /* //////////////////////////////////////////////////////////////////// */
86 #endif /* EXTL_TYPE_NULL_TYPE_H */
87 /* //////////////////////////////////////////////////////////////////// */