1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <locale>
11 
12 // template <class charT> class collate;
13 
14 // explicit collate(size_t refs = 0);
15 
16 #include <locale>
17 #include <type_traits>
18 #include <cassert>
19 
20 template <class C>
21 class my_facet
22     : public std::collate<C>
23 {
24 public:
25     static int count;
26 
27     explicit my_facet(std::size_t refs = 0)
28         : std::collate<C>(refs) {++count;}
29 
30     ~my_facet() {--count;}
31 };
32 
33 template <class C> int my_facet<C>::count = 0;
34 
35 int main()
36 {
37     {
38         std::locale l(std::locale::classic(), new my_facet<char>);
39         assert(my_facet<char>::count == 1);
40     }
41     assert(my_facet<char>::count == 0);
42     {
43         my_facet<char> f(1);
44         assert(my_facet<char>::count == 1);
45         {
46             std::locale l(std::locale::classic(), &f);
47             assert(my_facet<char>::count == 1);
48         }
49         assert(my_facet<char>::count == 1);
50     }
51     assert(my_facet<char>::count == 0);
52     {
53         std::locale l(std::locale::classic(), new my_facet<wchar_t>);
54         assert(my_facet<wchar_t>::count == 1);
55     }
56     assert(my_facet<wchar_t>::count == 0);
57     {
58         my_facet<wchar_t> f(1);
59         assert(my_facet<wchar_t>::count == 1);
60         {
61             std::locale l(std::locale::classic(), &f);
62             assert(my_facet<wchar_t>::count == 1);
63         }
64         assert(my_facet<wchar_t>::count == 1);
65     }
66     assert(my_facet<wchar_t>::count == 0);
67 }
68