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
34namespace boost {
35namespace 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
172