1 // Copyright 2010, Niels Dekker. 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See 4 // accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // Test program for boost::initialized<T>. 8 // 9 // 2 May 2010 (Created) Niels Dekker 10 11 #include <boost/utility/value_init.hpp> 12 #include <boost/core/lightweight_test.hpp> 13 14 #include <string> 15 16 namespace 17 { 18 // Typical use case for boost::initialized<T>: A generic class that 19 // holds a value of type T, which must be initialized by either 20 // value-initialization or direct-initialization. 21 template <class T> class key_value_pair 22 { 23 std::string m_key; 24 boost::initialized<T> m_value; 25 public: 26 27 // Value-initializes the object held by m_value. key_value_pair()28 key_value_pair() { } 29 30 // Value-initializes the object held by m_value. key_value_pair(const std::string & key)31 explicit key_value_pair(const std::string& key) 32 : 33 m_key(key) 34 { 35 } 36 37 // Direct-initializes the object held by m_value. key_value_pair(const std::string & key,const T & value)38 key_value_pair(const std::string& key, const T& value) 39 : 40 m_key(key), m_value(value) 41 { 42 } 43 get_value() const44 const T& get_value() const 45 { 46 return m_value; 47 } 48 }; 49 50 51 // Tells whether the argument is value-initialized. is_value_initialized(const int & arg)52 bool is_value_initialized(const int& arg) 53 { 54 return arg == 0; 55 } 56 57 58 // Tells whether the argument is value-initialized. is_value_initialized(const std::string & arg)59 bool is_value_initialized(const std::string& arg) 60 { 61 return arg.empty(); 62 } 63 64 struct foo 65 { 66 int data; 67 }; 68 operator ==(const foo & lhs,const foo & rhs)69 bool operator==(const foo& lhs, const foo& rhs) 70 { 71 return lhs.data == rhs.data; 72 } 73 74 75 // Tells whether the argument is value-initialized. is_value_initialized(const foo & arg)76 bool is_value_initialized(const foo& arg) 77 { 78 return arg.data == 0; 79 } 80 81 82 template <class T> test_key_value_pair(const T & magic_value)83 void test_key_value_pair(const T& magic_value) 84 { 85 // The value component of a default key_value_pair must be value-initialized. 86 key_value_pair<T> default_key_value_pair; 87 BOOST_TEST( is_value_initialized(default_key_value_pair.get_value() ) ); 88 89 // The value component of a key_value_pair that only has its key explicitly specified 90 // must also be value-initialized. 91 BOOST_TEST( is_value_initialized(key_value_pair<T>("key").get_value()) ); 92 93 // However, the value component of the following key_value_pair must be 94 // "magic_value", as it must be direct-initialized. 95 BOOST_TEST( key_value_pair<T>("key", magic_value).get_value() == magic_value ); 96 } 97 } 98 99 100 // Tests boost::initialize for a fundamental type, a type with a 101 // user-defined constructor, and a user-defined type without 102 // a user-defined constructor. main()103 int main() 104 { 105 106 const int magic_number = 42; 107 test_key_value_pair(magic_number); 108 109 const std::string magic_string = "magic value"; 110 test_key_value_pair(magic_string); 111 112 const foo magic_foo = { 42 }; 113 test_key_value_pair(magic_foo); 114 115 return boost::report_errors(); 116 } 117