]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | ////////////////////////////////////////////////////////////////////////////// |
2 | // | |
3 | // (C) Copyright Ion Gaztanaga 2012-2013. Distributed under the Boost | |
4 | // Software License, Version 1.0. (See accompanying file | |
5 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | // | |
7 | // See http://www.boost.org/libs/container for documentation. | |
8 | // | |
9 | ////////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | #ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP | |
12 | #define BOOST_CONTAINER_THROW_EXCEPTION_HPP | |
13 | ||
14 | #ifndef BOOST_CONFIG_HPP | |
15 | # include <boost/config.hpp> | |
16 | #endif | |
17 | ||
18 | #if defined(BOOST_HAS_PRAGMA_ONCE) | |
19 | # pragma once | |
20 | #endif | |
21 | ||
22 | #include <boost/container/detail/config_begin.hpp> | |
23 | #include <boost/container/detail/workaround.hpp> | |
24 | ||
25 | #ifndef BOOST_NO_EXCEPTIONS | |
26 | #include <stdexcept> //for std exception types | |
27 | #include <string> //for implicit std::string conversion | |
28 | #include <new> //for std::bad_alloc | |
29 | #else | |
30 | #include <boost/assert.hpp> | |
31 | #include <cstdlib> //for std::abort | |
32 | #endif | |
33 | ||
34 | namespace boost { | |
35 | namespace container { | |
36 | ||
37 | #if defined(BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS) | |
38 | //The user must provide definitions for the following functions | |
39 | ||
40 | void throw_bad_alloc(); | |
41 | ||
42 | void throw_out_of_range(const char* str); | |
43 | ||
44 | void throw_length_error(const char* str); | |
45 | ||
46 | void throw_logic_error(const char* str); | |
47 | ||
48 | void throw_runtime_error(const char* str); | |
49 | ||
50 | #elif defined(BOOST_NO_EXCEPTIONS) | |
51 | ||
52 | inline void throw_bad_alloc() | |
53 | { | |
54 | BOOST_ASSERT(!"boost::container bad_alloc thrown"); | |
55 | std::abort(); | |
56 | } | |
57 | ||
58 | inline void throw_out_of_range(const char* str) | |
59 | { | |
60 | BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str); | |
61 | std::abort(); | |
62 | } | |
63 | ||
64 | inline void throw_length_error(const char* str) | |
65 | { | |
66 | BOOST_ASSERT_MSG(!"boost::container length_error thrown", str); | |
67 | std::abort(); | |
68 | } | |
69 | ||
70 | inline void throw_logic_error(const char* str) | |
71 | { | |
72 | BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str); | |
73 | std::abort(); | |
74 | } | |
75 | ||
76 | inline void throw_runtime_error(const char* str) | |
77 | { | |
78 | BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str); | |
79 | std::abort(); | |
80 | } | |
81 | ||
82 | #else //defined(BOOST_NO_EXCEPTIONS) | |
83 | ||
84 | //! Exception callback called by Boost.Container when fails to allocate the requested storage space. | |
85 | //! <ul> | |
86 | //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::bad_alloc()</code> is thrown.</li> | |
87 | //! | |
88 | //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS | |
89 | //! is NOT defined <code>BOOST_ASSERT(!"boost::container bad_alloc thrown")</code> is called | |
90 | //! and <code>std::abort()</code> if the former returns.</li> | |
91 | //! | |
92 | //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined | |
93 | //! the user must provide an implementation and the function should not return.</li> | |
94 | //! </ul> | |
95 | inline void throw_bad_alloc() | |
96 | { | |
97 | throw std::bad_alloc(); | |
98 | } | |
99 | ||
100 | //! Exception callback called by Boost.Container to signal arguments out of range. | |
101 | //! <ul> | |
102 | //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::out_of_range(str)</code> is thrown.</li> | |
103 | //! | |
104 | //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS | |
105 | //! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str)</code> is called | |
106 | //! and <code>std::abort()</code> if the former returns.</li> | |
107 | //! | |
108 | //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined | |
109 | //! the user must provide an implementation and the function should not return.</li> | |
110 | //! </ul> | |
111 | inline void throw_out_of_range(const char* str) | |
112 | { | |
113 | throw std::out_of_range(str); | |
114 | } | |
115 | ||
116 | //! Exception callback called by Boost.Container to signal errors resizing. | |
117 | //! <ul> | |
118 | //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::length_error(str)</code> is thrown.</li> | |
119 | //! | |
120 | //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS | |
121 | //! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container length_error thrown", str)</code> is called | |
122 | //! and <code>std::abort()</code> if the former returns.</li> | |
123 | //! | |
124 | //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined | |
125 | //! the user must provide an implementation and the function should not return.</li> | |
126 | //! </ul> | |
127 | inline void throw_length_error(const char* str) | |
128 | { | |
129 | throw std::length_error(str); | |
130 | } | |
131 | ||
132 | //! Exception callback called by Boost.Container to report errors in the internal logical | |
133 | //! of the program, such as violation of logical preconditions or class invariants. | |
134 | //! <ul> | |
135 | //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::logic_error(str)</code> is thrown.</li> | |
136 | //! | |
137 | //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS | |
138 | //! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str)</code> is called | |
139 | //! and <code>std::abort()</code> if the former returns.</li> | |
140 | //! | |
141 | //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined | |
142 | //! the user must provide an implementation and the function should not return.</li> | |
143 | //! </ul> | |
144 | inline void throw_logic_error(const char* str) | |
145 | { | |
146 | throw std::logic_error(str); | |
147 | } | |
148 | ||
149 | //! Exception callback called by Boost.Container to report errors that can only be detected during runtime. | |
150 | //! <ul> | |
151 | //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::runtime_error(str)</code> is thrown.</li> | |
152 | //! | |
153 | //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS | |
154 | //! is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str)</code> is called | |
155 | //! and <code>std::abort()</code> if the former returns.</li> | |
156 | //! | |
157 | //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined | |
158 | //! the user must provide an implementation and the function should not return.</li> | |
159 | //! </ul> | |
160 | inline void throw_runtime_error(const char* str) | |
161 | { | |
162 | throw std::runtime_error(str); | |
163 | } | |
164 | ||
165 | #endif | |
166 | ||
167 | }} //namespace boost { namespace container { | |
168 | ||
169 | #include <boost/container/detail/config_end.hpp> | |
170 | ||
171 | #endif //#ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP |