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
172