• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 Copyright 2012-2015 Glen Joseph Fernandes
3 (glenjofe@gmail.com)
4 
5 Distributed under the Boost Software License, Version 1.0.
6 (http://www.boost.org/LICENSE_1_0.txt)
7 */
8 #include <boost/core/lightweight_test.hpp>
9 #include <boost/smart_ptr/enable_shared_from_this.hpp>
10 #include <boost/smart_ptr/make_shared.hpp>
11 
12 template<class T = void>
13 struct creator {
14     typedef T value_type;
15 
16     template<class U>
17     struct rebind {
18         typedef creator<U> other;
19     };
20 
creatorcreator21     creator() { }
22 
23     template<class U>
creatorcreator24     creator(const creator<U>&) { }
25 
allocatecreator26     T* allocate(std::size_t size) {
27         return static_cast<T*>(::operator new(sizeof(T) * size));
28     }
29 
deallocatecreator30     void deallocate(T* ptr, std::size_t) {
31         ::operator delete(ptr);
32     }
33 };
34 
35 template<class T, class U>
36 inline bool
operator ==(const creator<T> &,const creator<U> &)37 operator==(const creator<T>&, const creator<U>&)
38 {
39     return true;
40 }
41 
42 template<class T, class U>
43 inline bool
operator !=(const creator<T> &,const creator<U> &)44 operator!=(const creator<T>&, const creator<U>&)
45 {
46     return false;
47 }
48 
49 class type
50     : public boost::enable_shared_from_this<type> {
51 public:
52     static unsigned instances;
53 
type()54     type() {
55         ++instances;
56     }
57 
~type()58     ~type() {
59         --instances;
60     }
61 
62 private:
63     type(const type&);
64     type& operator=(const type&);
65 };
66 
67 unsigned type::instances = 0;
68 
main()69 int main()
70 {
71     BOOST_TEST(type::instances == 0);
72     {
73         boost::shared_ptr<type[]> result =
74             boost::allocate_shared<type[]>(creator<type>(), 3);
75         try {
76             result[0].shared_from_this();
77             BOOST_ERROR("shared_from_this did not throw");
78         } catch (...) {
79             BOOST_TEST(type::instances == 3);
80         }
81     }
82     BOOST_TEST(type::instances == 0);
83     {
84         boost::shared_ptr<type[]> result =
85             boost::allocate_shared_noinit<type[]>(creator<>(), 3);
86         try {
87             result[0].shared_from_this();
88             BOOST_ERROR("shared_from_this did not throw");
89         } catch (...) {
90             BOOST_TEST(type::instances == 3);
91         }
92     }
93     return boost::report_errors();
94 }
95