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    BOOST_NORETURN inline void throw_bad_alloc()
53    {
54       const char msg[] = "boost::container bad_alloc thrown";
55       (void)msg;
56       BOOST_ASSERT(!msg);
57       std::abort();
58    }
59 
60    BOOST_NORETURN inline void throw_out_of_range(const char* str)
61    {
62       const char msg[] = "boost::container out_of_range thrown";
63       (void)msg; (void)str;
64       BOOST_ASSERT_MSG(!msg, str);
65       std::abort();
66    }
67 
68    BOOST_NORETURN inline void throw_length_error(const char* str)
69    {
70       const char msg[] = "boost::container length_error thrown";
71       (void)msg; (void)str;
72       BOOST_ASSERT_MSG(!msg, str);
73       std::abort();
74    }
75 
76    BOOST_NORETURN inline void throw_logic_error(const char* str)
77    {
78       const char msg[] = "boost::container logic_error thrown";
79       (void)msg; (void)str;
80       BOOST_ASSERT_MSG(!msg, str);
81       std::abort();
82    }
83 
84    BOOST_NORETURN inline void throw_runtime_error(const char* str)
85    {
86       const char msg[] = "boost::container runtime_error thrown";
87       (void)msg; (void)str;
88       BOOST_ASSERT_MSG(!msg, str);
89       std::abort();
90    }
91 
92 #else //defined(BOOST_NO_EXCEPTIONS)
93 
94    //! Exception callback called by Boost.Container when fails to allocate the requested storage space.
95    //! <ul>
96    //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::bad_alloc()</code> is thrown.</li>
97    //!
98    //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
99    //!   is NOT defined <code>BOOST_ASSERT(!"boost::container bad_alloc thrown")</code> is called
100    //!   and <code>std::abort()</code> if the former returns.</li>
101    //!
102    //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
103    //!   the user must provide an implementation and the function should not return.</li>
104    //! </ul>
105    BOOST_NORETURN inline void throw_bad_alloc()
106    {
107       throw std::bad_alloc();
108    }
109 
110    //! Exception callback called by Boost.Container to signal arguments out of range.
111    //! <ul>
112    //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::out_of_range(str)</code> is thrown.</li>
113    //!
114    //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
115    //!   is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str)</code> is called
116    //!   and <code>std::abort()</code> if the former returns.</li>
117    //!
118    //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
119    //!   the user must provide an implementation and the function should not return.</li>
120    //! </ul>
121    BOOST_NORETURN inline void throw_out_of_range(const char* str)
122    {
123       throw std::out_of_range(str);
124    }
125 
126    //! Exception callback called by Boost.Container to signal errors resizing.
127    //! <ul>
128    //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::length_error(str)</code> is thrown.</li>
129    //!
130    //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
131    //!   is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container length_error thrown", str)</code> is called
132    //!   and <code>std::abort()</code> if the former returns.</li>
133    //!
134    //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
135    //!   the user must provide an implementation and the function should not return.</li>
136    //! </ul>
137    BOOST_NORETURN inline void throw_length_error(const char* str)
138    {
139       throw std::length_error(str);
140    }
141 
142    //! Exception callback called by Boost.Container  to report errors in the internal logical
143    //! of the program, such as violation of logical preconditions or class invariants.
144    //! <ul>
145    //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::logic_error(str)</code> is thrown.</li>
146    //!
147    //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
148    //!   is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str)</code> is called
149    //!   and <code>std::abort()</code> if the former returns.</li>
150    //!
151    //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
152    //!   the user must provide an implementation and the function should not return.</li>
153    //! </ul>
154    BOOST_NORETURN inline void throw_logic_error(const char* str)
155    {
156       throw std::logic_error(str);
157    }
158 
159    //! Exception callback called by Boost.Container  to report errors that can only be detected during runtime.
160    //! <ul>
161    //! <li>If BOOST_NO_EXCEPTIONS is NOT defined <code>std::runtime_error(str)</code> is thrown.</li>
162    //!
163    //! <li>If BOOST_NO_EXCEPTIONS is defined and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
164    //!   is NOT defined <code>BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str)</code> is called
165    //!   and <code>std::abort()</code> if the former returns.</li>
166    //!
167    //! <li>If BOOST_NO_EXCEPTIONS and BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS are defined
168    //!   the user must provide an implementation and the function should not return.</li>
169    //! </ul>
170    BOOST_NORETURN inline void throw_runtime_error(const char* str)
171    {
172       throw std::runtime_error(str);
173    }
174 
175 #endif
176 
177 }}  //namespace boost { namespace container {
178 
179 #include <boost/container/detail/config_end.hpp>
180 
181 #endif //#ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP
182