46#ifndef _THROW_ALLOCATOR_H
47#define _THROW_ALLOCATOR_H 1
60#if __cplusplus >= 201103L
64# include <tr1/functional>
69#if !__has_builtin(__builtin_sprintf)
73namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
75_GLIBCXX_BEGIN_NAMESPACE_VERSION
86 __throw_forced_error()
101 typedef map_alloc_type::const_iterator const_iterator;
102 typedef map_alloc_type::const_reference const_reference;
103#if __cplusplus >= 201103L
123 insert(
void* p,
size_t size)
128 std::string error(
"annotate_base::insert null insert!\n");
129 log_to_string(error, entry);
130 std::__throw_logic_error(error.
c_str());
134 = map_alloc().
insert(entry);
137 std::string error(
"annotate_base::insert double insert!\n");
138 log_to_string(error, entry);
139 log_to_string(error, *inserted.
first);
140 std::__throw_logic_error(error.
c_str());
145 erase(
void* p,
size_t size)
146 { map_alloc().
erase(check_allocated(p, size)); }
148#if __cplusplus >= 201103L
150 insert_construct(
void* p)
154 std::string error(
"annotate_base::insert_construct null!\n");
155 std::__throw_logic_error(error.
c_str());
158 auto inserted = map_construct().
insert(std::make_pair(p, get_label()));
159 if (!inserted.second)
161 std::string error(
"annotate_base::insert_construct double insert!\n");
162 log_to_string(error, std::make_pair(p, get_label()));
163 log_to_string(error, *inserted.first);
164 std::__throw_logic_error(error.
c_str());
169 erase_construct(
void* p)
170 { map_construct().
erase(check_constructed(p)); }
174 inline map_alloc_type::iterator
175 check_allocated(
void* p,
size_t size)
177 map_alloc_type::iterator found = map_alloc().
find(p);
178 if (found == map_alloc().end())
180 std::string error(
"annotate_base::check_allocated by value "
182 log_to_string(error, make_entry(p, size));
183 std::__throw_logic_error(error.
c_str());
186 if (found->second.second != size)
188 std::string error(
"annotate_base::check_allocated by value "
189 "wrong-size erase!\n");
190 log_to_string(error, make_entry(p, size));
191 log_to_string(error, *found);
192 std::__throw_logic_error(error.
c_str());
204 const_iterator beg = map_alloc().
begin();
205 const_iterator end = map_alloc().
end();
208 if (beg->second.first == label)
209 log_to_string(found, *beg);
214#if __cplusplus >= 201103L
216 auto beg = map_construct().
begin();
217 auto end = map_construct().
end();
220 if (beg->second == label)
221 log_to_string(found, *beg);
229 std::string error(
"annotate_base::check by label\n");
231 std::__throw_logic_error(error.
c_str());
241 const_iterator beg = map_alloc().
begin();
242 const_iterator end = map_alloc().
end();
245 log_to_string(found, *beg);
250#if __cplusplus >= 201103L
252 auto beg = map_construct().
begin();
253 auto end = map_construct().
end();
256 log_to_string(found, *beg);
266 std::__throw_logic_error(error.
c_str());
270#if __cplusplus >= 201103L
271 inline map_construct_type::iterator
272 check_constructed(
void* p)
274 auto found = map_construct().
find(p);
275 if (found == map_construct().end())
277 std::string error(
"annotate_base::check_constructed not "
279 log_to_string(error, std::make_pair(p, get_label()));
280 std::__throw_logic_error(error.
c_str());
287 check_constructed(
size_t label)
289 auto beg = map_construct().
begin();
290 auto end = map_construct().
end();
294 if (beg->second == label)
295 log_to_string(found, *beg);
301 std::string error(
"annotate_base::check_constructed by label\n");
303 std::__throw_logic_error(error.
c_str());
313 make_entry(
void* p,
size_t size)
314 {
return std::make_pair(p,
data_type(get_label(), size)); }
319#if ! __has_builtin(__builtin_sprintf)
320 __typeof__(&std::sprintf) __builtin_sprintf = &std::sprintf;
324 const char tab(
'\t');
326 unsigned long l =
static_cast<unsigned long>(ref.second.first);
327 __builtin_sprintf(buf,
"%lu", l);
331 l =
static_cast<unsigned long>(ref.second.second);
332 __builtin_sprintf(buf,
"%lu", l);
336 __builtin_sprintf(buf,
"%p", ref.first);
341#if __cplusplus >= 201103L
345#if ! __has_builtin(__builtin_sprintf)
346 auto __builtin_sprintf = &std::sprintf;
350 const char tab(
'\t');
352 unsigned long l =
static_cast<unsigned long>(ref.
second);
353 __builtin_sprintf(buf,
"%lu", l);
357 __builtin_sprintf(buf,
"%p", ref.
first);
377#if __cplusplus >= 201103L
393 base_type::const_iterator beg = __b.map_alloc().
begin();
394 base_type::const_iterator end = __b.map_alloc().
end();
395 for (; beg != end; ++beg)
396 __b.log_to_string(error, *beg);
398#if __cplusplus >= 201103L
400 auto beg = __b.map_construct().
begin();
401 auto end = __b.map_construct().
end();
402 for (; beg != end; ++beg)
403 __b.log_to_string(error, *beg);
418#if __cplusplus >= 201103L
438 const size_t _M_orig;
441 adjustor_base() : _M_orig(limit()) { }
444 ~adjustor_base() { set_limit(_M_orig); }
468 throw_conditionally()
470 if (count() == limit())
471 __throw_forced_error();
478 static size_t _S_count(0);
491 set_limit(
const size_t __l)
509 const double _M_orig;
512 adjustor_base() : _M_orig(probability()) { }
514 virtual ~adjustor_base()
515 { set_probability(_M_orig); }
522 { set_probability(1 -
std::pow(
double(1 - probability()),
523 double(0.5 / (size + 1))));
546 set_probability(
double __p)
547 { probability() = __p; }
550 throw_conditionally()
552 if (generate() < probability())
553 __throw_forced_error();
557 seed(
unsigned long __s)
558 { engine().seed(__s); }
561#if __cplusplus >= 201103L
565 typedef std::tr1::uniform_real<double> distribution_type;
566 typedef std::tr1::mt19937 engine_type;
572#if __cplusplus >= 201103L
573 const distribution_type distribution(0, 1);
574 static auto generator =
std::bind(distribution, engine());
577 typedef std::tr1::variate_generator<engine_type, distribution_type> gen_t;
578 distribution_type distribution(0, 1);
579 static gen_t generator(engine(), distribution);
582#if ! __has_builtin(__builtin_sprintf)
583 __typeof__(&std::sprintf) __builtin_sprintf = &std::sprintf;
586 double random = generator();
587 if (random < distribution.min() || random > distribution.max())
591 __s +=
"random number generated is: ";
593 __builtin_sprintf(buf,
"%f", random);
595 std::__throw_out_of_range(__s.c_str());
611 static engine_type _S_e;
622 template<
typename _Cond>
625 typedef _Cond condition_type;
627 using condition_type::throw_conditionally;
631#ifndef _GLIBCXX_IS_AGGREGATE
633 { throw_conditionally(); }
636 { throw_conditionally(); }
638#if __cplusplus >= 201103L
644 { throw_conditionally(); }
650 throw_conditionally();
655#if __cplusplus >= 201103L
664 throw_conditionally();
670 template<
typename _Cond>
675 throw_value::throw_conditionally();
676 throw_value orig(__a);
682 template<
typename _Cond>
684 operator==(
const throw_value_base<_Cond>& __a,
685 const throw_value_base<_Cond>& __b)
687 typedef throw_value_base<_Cond> throw_value;
688 throw_value::throw_conditionally();
689 bool __ret = __a._M_i == __b._M_i;
693 template<
typename _Cond>
695 operator<(
const throw_value_base<_Cond>& __a,
696 const throw_value_base<_Cond>& __b)
698 typedef throw_value_base<_Cond> throw_value;
699 throw_value::throw_conditionally();
700 bool __ret = __a._M_i < __b._M_i;
705 template<
typename _Cond>
706 inline throw_value_base<_Cond>
707 operator+(
const throw_value_base<_Cond>& __a,
708 const throw_value_base<_Cond>& __b)
710 typedef throw_value_base<_Cond> throw_value;
711 throw_value::throw_conditionally();
712 throw_value __ret(__a._M_i + __b._M_i);
716 template<
typename _Cond>
717 inline throw_value_base<_Cond>
718 operator-(
const throw_value_base<_Cond>& __a,
719 const throw_value_base<_Cond>& __b)
721 typedef throw_value_base<_Cond> throw_value;
722 throw_value::throw_conditionally();
723 throw_value __ret(__a._M_i - __b._M_i);
727 template<
typename _Cond>
728 inline throw_value_base<_Cond>
729 operator*(
const throw_value_base<_Cond>& __a,
730 const throw_value_base<_Cond>& __b)
732 typedef throw_value_base<_Cond> throw_value;
733 throw_value::throw_conditionally();
734 throw_value __ret(__a._M_i * __b._M_i);
744#ifndef _GLIBCXX_IS_AGGREGATE
750#if __cplusplus >= 201103L
760 base_type::operator=(__other);
764#if __cplusplus >= 201103L
775#ifndef _GLIBCXX_IS_AGGREGATE
781#if __cplusplus >= 201103L
791 base_type::operator=(__other);
795#if __cplusplus >= 201103L
808 template<
typename _Tp,
typename _Cond>
813 typedef std::size_t size_type;
814 typedef std::ptrdiff_t difference_type;
815 typedef _Tp value_type;
816 typedef value_type* pointer;
817 typedef const value_type* const_pointer;
818 typedef value_type& reference;
819 typedef const value_type& const_reference;
821#if __cplusplus >= 201103L
828 typedef _Cond condition_type;
834 using condition_type::throw_conditionally;
838 max_size()
const _GLIBCXX_USE_NOEXCEPT
842 address(reference __x)
const _GLIBCXX_NOEXCEPT
846 address(const_reference __x)
const _GLIBCXX_NOEXCEPT
849 _GLIBCXX_NODISCARD pointer
850 allocate(size_type __n,
const void* __hint = 0)
852 if (__n > this->max_size())
853 std::__throw_bad_alloc();
855 throw_conditionally();
857 insert(a,
sizeof(value_type) * __n);
861#if __cplusplus >= 201103L
862 template<
typename _Up,
typename... _Args>
864 construct(_Up* __p, _Args&&... __args)
866 traits::construct(_M_allocator, __p, std::forward<_Args>(__args)...);
867 insert_construct(__p);
870 template<
typename _Up>
874 erase_construct(__p);
875 traits::destroy(_M_allocator, __p);
879 construct(pointer __p,
const value_type& __val)
880 {
return _M_allocator.construct(__p, __val); }
884 { _M_allocator.destroy(__p); }
888 deallocate(pointer __p, size_type __n)
890 erase(__p,
sizeof(value_type) * __n);
891 _M_allocator.deallocate(__p, __n);
895 check_allocated(pointer __p, size_type __n)
897 size_type __t =
sizeof(value_type) * __n;
898 annotate_base::check_allocated(__p, __t);
903 { annotate_base::check(__n); }
906 template<
typename _Tp,
typename _Cond>
912#if __cpp_impl_three_way_comparison < 201907L
913 template<
typename _Tp,
typename _Cond>
915 operator!=(
const throw_allocator_base<_Tp, _Cond>&,
916 const throw_allocator_base<_Tp, _Cond>&)
921 template<
typename _Tp>
925 template<
typename _Tp1>
932 _GLIBCXX_USE_NOEXCEPT { }
934 template<
typename _Tp1>
936 _GLIBCXX_USE_NOEXCEPT { }
940#if __cplusplus >= 201103L
947 template<
typename _Tp>
951 template<
typename _Tp1>
958 _GLIBCXX_USE_NOEXCEPT { }
960 template<
typename _Tp1>
962 _GLIBCXX_USE_NOEXCEPT { }
966#if __cplusplus >= 201103L
972_GLIBCXX_END_NAMESPACE_VERSION
975#if __cplusplus >= 201103L
979namespace std _GLIBCXX_VISIBILITY(default)
981#pragma GCC diagnostic push
982#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
992 __gnu_cxx::throw_value_limit::throw_conditionally();
994 size_t __result = __h(__val._M_i);
1007 __gnu_cxx::throw_value_random::throw_conditionally();
1009 size_t __result = __h(__val._M_i);
1014#pragma GCC diagnostic pop
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
complex< _Tp > pow(const complex< _Tp > &, int)
Return x to the y'th power.
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Bind_helper< __is_socketlike< _Func >::value, _Func, _BoundArgs... >::type bind(_Func &&__f, _BoundArgs &&... __args)
Function template for std::bind.
ISO C++ entities toplevel namespace is std.
GNU extensions for public use.
Properties of fundamental types.
Primary class template hash.
The standard allocator, as per C++03 [20.4.1].
bool empty() const noexcept
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
Base class for all library exceptions.
std::mersenne_twister_engine< uint_fast32_t, 32, 624, 397, 31, 0x9908b0dfUL, 11, 0xffffffffUL, 7, 0x9d2c5680UL, 15, 0xefc60000UL, 18, 1812433253UL >
Uniform continuous distribution for random numbers.
Struct holding two objects of arbitrary type.
_T1 first
The first member.
_T2 second
The second member.
A standard container made up of (key,value) pairs, which can be retrieved based on a key,...
insert_return_type insert(node_type &&__nh)
Re-insert an extracted node.
iterator find(const key_type &__x)
Tries to locate an element in a map.
iterator erase(const_iterator __position)
Erases an element from a map.
iterator begin() noexcept
Uniform interface to C++98 and C++11 allocators.
static constexpr pointer allocate(_Alloc &__a, size_type __n)
Allocate memory.
static constexpr size_type max_size(const _Alloc &__a) noexcept
The maximum supported allocation size.
Thrown by utilities for testing exception safety.
Base class for checking address and label information about allocations. Create a std::map between th...
Base struct for condition policy.
Base class for incremental control and throw.
Never enter the condition.
Always enter the condition.
Base class for random probability control and throw.
Never enter the condition.
Always enter the condition.
Class with exception generation control. Intended to be used as a value_type in templatized code.
Type throwing via limit condition.
Type throwing via random condition.
Allocator class with logging and exception generation control. Intended to be used as an allocator_ty...
Allocator throwing via limit condition.
Allocator throwing via random condition.