GDB (xrefs)
4.cc
Go to the documentation of this file.
1 // Copyright (C) 2013-2018 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17 
18 namespace assign_4 {
19 
20 struct exception {};
21 
22 int counter = 0;
23 
25 {
29 };
30 
31 struct value_type : private mixin_counter
32 {
34  {
43  };
44 
45  value_type() = default;
46 
47  explicit value_type(state_type state_)
48  : state(state_)
49  {
51  }
52 
53  value_type(value_type const& other)
54  : state(other.state)
55  {
57  }
58 
59  value_type&
60  operator=(value_type const& other)
61  {
62  state = other.state;
64  return *this;
65  }
66 
68  : state(other.state)
69  {
70  other.state = moved_from;
72  }
73 
74  value_type&
76  {
77  state = other.state;
78  other.state = moved_from;
80  return *this;
81  }
82 
83  void throw_if(state_type match)
84  {
85  if(state == match)
86  {
87  state = threw;
88  throw exception {};
89  }
90  }
91 
93 };
94 
95 void test()
96 {
97  using O = gdb::optional<value_type>;
98  using S = value_type::state_type;
99  auto const make = [](S s = S::zero) { return value_type { s }; };
100 
101  enum outcome_type { nothrow, caught, bad_catch };
102 
103  // Check value assignment for engaged optional
104 
105  {
106  O o = make();
107  value_type v = make(S::throwing_copy);
108  o = v;
109  VERIFY( o && o->state == S::throwing_copy);
110  }
111 
112  {
113  O o = make();
114  value_type v = make(S::throwing_move);
115  o = std::move(v);
116  VERIFY( o && o->state == S::throwing_move);
117  }
118 
119  {
120  ATTRIBUTE_UNUSED outcome_type outcome {};
121  O o = make();
122  value_type v = make(S::throwing_copy_assignment);
123 
124  try
125  {
126  o = v;
127  }
128  catch(exception const&)
129  { outcome = caught; }
130  catch(...)
131  { outcome = bad_catch; }
132 
133  VERIFY( o && o->state == S::threw );
134  }
135 
136  {
137  ATTRIBUTE_UNUSED outcome_type outcome {};
138  O o = make();
139  value_type v = make(S::throwing_move_assignment);
140 
141  try
142  {
143  o = std::move(v);
144  }
145  catch(exception const&)
146  { outcome = caught; }
147  catch(...)
148  { outcome = bad_catch; }
149 
150  VERIFY( o && o->state == S::threw );
151  }
152 
153  VERIFY( counter == 0 );
154 }
155 
156 } // namespace assign_4
value_type(value_type const &other)
Definition: 4.cc:53
state_type state
Definition: 4.cc:92
value_type(value_type &&other)
Definition: 4.cc:67
#define VERIFY
void throw_if(state_type match)
Definition: 4.cc:83
int counter
Definition: 4.cc:22
value_type & operator=(value_type &&other)
Definition: 4.cc:75
#define S(reg)
Definition: m32c-tdep.c:793
Definition: 4.cc:18
mixin_counter(mixin_counter const &)
Definition: 4.cc:27
value_type(state_type state_)
Definition: 4.cc:47
value_type & operator=(value_type const &other)
Definition: 4.cc:60
void test()
Definition: 4.cc:95