1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // test_singleton.cpp
3 
4 // (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
5 // Use, modification and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 // should pass compilation and execution
10 
11 #include <iostream>
12 #include <boost/serialization/singleton.hpp>
13 
14 #include "test_tools.hpp"
15 
16 static int i = 0;
17 
18 struct A {
19     int m_id;
AA20     A() : m_id(++i) {}
~AA21     ~A(){
22         // verify that objects are destroyed in sequence reverse of construction
23         if(i-- != m_id) std::terminate();
24     }
25 };
26 
27 struct B {
28     int m_id;
BB29     B() : m_id(++i) {}
~BB30     ~B(){
31         // verify that objects are destroyed in sequence reverse of construction
32         if(i-- != m_id) std::terminate();
33     }
34 };
35 
36 struct C {
37     int m_id;
CC38     C() : m_id(++i) {}
~CC39     ~C(){
40         // verify that objects are destroyed in sequence reverse of construction
41         if(i-- != m_id) std::terminate();
42     }
43 };
44 
45 struct D {
46     int m_id;
DD47     D(){
48         // verify that only one object is indeed created
49         const C & c = boost::serialization::singleton<C>::get_const_instance();
50         const C & c1 = boost::serialization::singleton<C>::get_const_instance();
51         BOOST_CHECK_EQUAL(&c, &c1);
52 
53         // verify that objects are created in sequence of definition
54         BOOST_CHECK_EQUAL(c.m_id, 1);
55         const B & b = boost::serialization::singleton<B>::get_const_instance();
56         BOOST_CHECK_EQUAL(b.m_id, 2);
57         const A & a = boost::serialization::singleton<A>::get_const_instance();
58         BOOST_CHECK_EQUAL(a.m_id, 3);
59         std::cout << a.m_id << b.m_id << c.m_id << '\n';
60 
61         m_id = ++i;
62     }
~DD63     ~D(){
64         // verify that objects are destroyed in sequence reverse of construction
65         if(i-- != m_id) std::terminate();
66     }
67 };
68 
test_main(int,char * [])69 int test_main(int, char *[]){
70     return 0;
71 }
72 
73 // note: not a singleton
74 D d;
75