blob: 2eeab54e533a7406864318b0079d9a7f9d03b450 [file] [log] [blame]
Brad Bishop0f291cc2019-09-01 15:16:57 -04001From ef90544f8df369781a6ef094330c9cfa9f0ee1e4 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Thu, 29 Aug 2019 14:09:11 -0700
4Subject: [PATCH 2/4] boost: Backport clang support
5
6backport headers from boost 1.59
7
8Signed-off-by: Khem Raj <raj.khem@gmail.com>
9---
10 lib/boost/config/compiler/clang.hpp | 272 +++++++++
11 lib/boost/config/stdlib/libcpp.hpp | 80 +++
12 lib/boost/cstdint.hpp | 542 ++++++++++++++++++
13 .../detail/sp_counted_base_clang.hpp | 140 +++++
14 4 files changed, 1034 insertions(+)
15 create mode 100644 lib/boost/config/compiler/clang.hpp
16 create mode 100644 lib/boost/config/stdlib/libcpp.hpp
17 create mode 100644 lib/boost/cstdint.hpp
18 create mode 100644 lib/boost/smart_ptr/detail/sp_counted_base_clang.hpp
19
20--- /dev/null
21+++ b/lib/boost/config/compiler/clang.hpp
22@@ -0,0 +1,272 @@
23+
24+// (C) Copyright Douglas Gregor 2010
25+//
26+// Use, modification and distribution are subject to the
27+// Boost Software License, Version 1.0. (See accompanying file
28+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
29+
30+// See http://www.boost.org for most recent version.
31+
32+// Clang compiler setup.
33+
34+#define BOOST_HAS_PRAGMA_ONCE
35+
36+// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.
37+#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
38+# define BOOST_HAS_PRAGMA_DETECT_MISMATCH
39+#endif
40+
41+// When compiling with clang before __has_extension was defined,
42+// even if one writes 'defined(__has_extension) && __has_extension(xxx)',
43+// clang reports a compiler error. So the only workaround found is:
44+
45+#ifndef __has_extension
46+#define __has_extension __has_feature
47+#endif
48+
49+#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)
50+# define BOOST_NO_EXCEPTIONS
51+#endif
52+
53+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)
54+# define BOOST_NO_RTTI
55+#endif
56+
57+#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)
58+# define BOOST_NO_TYPEID
59+#endif
60+
61+#if defined(__int64) && !defined(__GNUC__)
62+# define BOOST_HAS_MS_INT64
63+#endif
64+
65+#define BOOST_HAS_NRVO
66+
67+// Branch prediction hints
68+#if defined(__has_builtin)
69+#if __has_builtin(__builtin_expect)
70+#define BOOST_LIKELY(x) __builtin_expect(x, 1)
71+#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)
72+#endif
73+#endif
74+
75+// Clang supports "long long" in all compilation modes.
76+#define BOOST_HAS_LONG_LONG
77+
78+//
79+// We disable this if the compiler is really nvcc as it
80+// doesn't actually support __int128 as of CUDA_VERSION=5000
81+// even though it defines __SIZEOF_INT128__.
82+// See https://svn.boost.org/trac/boost/ticket/10418
83+// Only re-enable this for nvcc if you're absolutely sure
84+// of the circumstances under which it's supported:
85+//
86+#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)
87+# define BOOST_HAS_INT128
88+#endif
89+
90+
91+//
92+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
93+//
94+#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
95+# define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default")))
96+# define BOOST_SYMBOL_IMPORT
97+# define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
98+#endif
99+
100+//
101+// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
102+// between switch labels.
103+//
104+#if __cplusplus >= 201103L && defined(__has_warning)
105+# if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
106+# define BOOST_FALLTHROUGH [[clang::fallthrough]]
107+# endif
108+#endif
109+
110+#if !__has_feature(cxx_auto_type)
111+# define BOOST_NO_CXX11_AUTO_DECLARATIONS
112+# define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
113+#endif
114+
115+//
116+// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t
117+//
118+#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
119+# define BOOST_NO_CXX11_CHAR16_T
120+# define BOOST_NO_CXX11_CHAR32_T
121+#endif
122+
123+#if !__has_feature(cxx_constexpr)
124+# define BOOST_NO_CXX11_CONSTEXPR
125+#endif
126+
127+#if !__has_feature(cxx_decltype)
128+# define BOOST_NO_CXX11_DECLTYPE
129+#endif
130+
131+#if !__has_feature(cxx_decltype_incomplete_return_types)
132+# define BOOST_NO_CXX11_DECLTYPE_N3276
133+#endif
134+
135+#if !__has_feature(cxx_defaulted_functions)
136+# define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
137+#endif
138+
139+#if !__has_feature(cxx_deleted_functions)
140+# define BOOST_NO_CXX11_DELETED_FUNCTIONS
141+#endif
142+
143+#if !__has_feature(cxx_explicit_conversions)
144+# define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
145+#endif
146+
147+#if !__has_feature(cxx_default_function_template_args)
148+# define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
149+#endif
150+
151+#if !__has_feature(cxx_generalized_initializers)
152+# define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
153+#endif
154+
155+#if !__has_feature(cxx_lambdas)
156+# define BOOST_NO_CXX11_LAMBDAS
157+#endif
158+
159+#if !__has_feature(cxx_local_type_template_args)
160+# define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
161+#endif
162+
163+#if !__has_feature(cxx_noexcept)
164+# define BOOST_NO_CXX11_NOEXCEPT
165+#endif
166+
167+#if !__has_feature(cxx_nullptr)
168+# define BOOST_NO_CXX11_NULLPTR
169+#endif
170+
171+#if !__has_feature(cxx_range_for)
172+# define BOOST_NO_CXX11_RANGE_BASED_FOR
173+#endif
174+
175+#if !__has_feature(cxx_raw_string_literals)
176+# define BOOST_NO_CXX11_RAW_LITERALS
177+#endif
178+
179+#if !__has_feature(cxx_reference_qualified_functions)
180+# define BOOST_NO_CXX11_REF_QUALIFIERS
181+#endif
182+
183+#if !__has_feature(cxx_generalized_initializers)
184+# define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
185+#endif
186+
187+#if !__has_feature(cxx_rvalue_references)
188+# define BOOST_NO_CXX11_RVALUE_REFERENCES
189+#endif
190+
191+#if !__has_feature(cxx_strong_enums)
192+# define BOOST_NO_CXX11_SCOPED_ENUMS
193+#endif
194+
195+#if !__has_feature(cxx_static_assert)
196+# define BOOST_NO_CXX11_STATIC_ASSERT
197+#endif
198+
199+#if !__has_feature(cxx_alias_templates)
200+# define BOOST_NO_CXX11_TEMPLATE_ALIASES
201+#endif
202+
203+#if !__has_feature(cxx_unicode_literals)
204+# define BOOST_NO_CXX11_UNICODE_LITERALS
205+#endif
206+
207+#if !__has_feature(cxx_variadic_templates)
208+# define BOOST_NO_CXX11_VARIADIC_TEMPLATES
209+#endif
210+
211+#if !__has_feature(cxx_user_literals)
212+# define BOOST_NO_CXX11_USER_DEFINED_LITERALS
213+#endif
214+
215+#if !__has_feature(cxx_alignas)
216+# define BOOST_NO_CXX11_ALIGNAS
217+#endif
218+
219+#if !__has_feature(cxx_trailing_return)
220+# define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
221+#endif
222+
223+#if !__has_feature(cxx_inline_namespaces)
224+# define BOOST_NO_CXX11_INLINE_NAMESPACES
225+#endif
226+
227+#if !__has_feature(cxx_override_control)
228+# define BOOST_NO_CXX11_FINAL
229+#endif
230+
231+#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))
232+# define BOOST_NO_CXX14_BINARY_LITERALS
233+#endif
234+
235+#if !__has_feature(__cxx_decltype_auto__)
236+# define BOOST_NO_CXX14_DECLTYPE_AUTO
237+#endif
238+
239+#if !__has_feature(__cxx_aggregate_nsdmi__)
240+# define BOOST_NO_CXX14_AGGREGATE_NSDMI
241+#endif
242+
243+#if !__has_feature(__cxx_init_captures__)
244+# define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
245+#endif
246+
247+#if !__has_feature(__cxx_generic_lambdas__)
248+# define BOOST_NO_CXX14_GENERIC_LAMBDAS
249+#endif
250+
251+// clang < 3.5 has a defect with dependent type, like following.
252+//
253+// template <class T>
254+// constexpr typename enable_if<pred<T> >::type foo(T &)
255+// { } // error: no return statement in constexpr function
256+//
257+// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.
258+// Therefore we don't care such case.
259+//
260+// Note that we can't check Clang version directly as the numbering system changes depending who's
261+// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)
262+// so instead verify that we have a feature that was introduced at the same time as working C++14
263+// constexpr (generic lambda's in this case):
264+//
265+#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)
266+# define BOOST_NO_CXX14_CONSTEXPR
267+#endif
268+
269+#if !__has_feature(__cxx_return_type_deduction__)
270+# define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
271+#endif
272+
273+#if !__has_feature(__cxx_variable_templates__)
274+# define BOOST_NO_CXX14_VARIABLE_TEMPLATES
275+#endif
276+
277+#if __cplusplus < 201400
278+// All versions with __cplusplus above this value seem to support this:
279+# define BOOST_NO_CXX14_DIGIT_SEPARATORS
280+#endif
281+
282+
283+// Unused attribute:
284+#if defined(__GNUC__) && (__GNUC__ >= 4)
285+# define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
286+#endif
287+
288+#ifndef BOOST_COMPILER
289+# define BOOST_COMPILER "Clang version " __clang_version__
290+#endif
291+
292+// Macro used to identify the Clang compiler.
293+#define BOOST_CLANG 1
294+
295--- /dev/null
296+++ b/lib/boost/config/stdlib/libcpp.hpp
297@@ -0,0 +1,80 @@
298+// (C) Copyright Christopher Jefferson 2011.
299+// Use, modification and distribution are subject to the
300+// Boost Software License, Version 1.0. (See accompanying file
301+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
302+
303+// See http://www.boost.org for most recent version.
304+
305+// config for libc++
306+// Might need more in here later.
307+
308+#if !defined(_LIBCPP_VERSION)
309+# include <ciso646>
310+# if !defined(_LIBCPP_VERSION)
311+# error "This is not libc++!"
312+# endif
313+#endif
314+
315+#define BOOST_STDLIB "libc++ version " BOOST_STRINGIZE(_LIBCPP_VERSION)
316+
317+#define BOOST_HAS_THREADS
318+
319+#ifdef _LIBCPP_HAS_NO_VARIADICS
320+# define BOOST_NO_CXX11_HDR_TUPLE
321+#endif
322+
323+// BOOST_NO_CXX11_ALLOCATOR should imply no support for the C++11
324+// allocator model. The C++11 allocator model requires a conforming
325+// std::allocator_traits which is only possible with C++11 template
326+// aliases since members rebind_alloc and rebind_traits require it.
327+#if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)
328+# define BOOST_NO_CXX11_ALLOCATOR
329+#endif
330+
331+#if __cplusplus < 201103
332+# define BOOST_NO_CXX11_HDR_ARRAY
333+# define BOOST_NO_CXX11_HDR_CODECVT
334+# define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
335+# define BOOST_NO_CXX11_HDR_FORWARD_LIST
336+# define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
337+# define BOOST_NO_CXX11_HDR_MUTEX
338+# define BOOST_NO_CXX11_HDR_RANDOM
339+# define BOOST_NO_CXX11_HDR_RATIO
340+# define BOOST_NO_CXX11_HDR_REGEX
341+# define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
342+# define BOOST_NO_CXX11_HDR_THREAD
343+# define BOOST_NO_CXX11_HDR_TUPLE
344+# define BOOST_NO_CXX11_HDR_TYPEINDEX
345+# define BOOST_NO_CXX11_HDR_UNORDERED_MAP
346+# define BOOST_NO_CXX11_HDR_UNORDERED_SET
347+# define BOOST_NO_CXX11_NUMERIC_LIMITS
348+# define BOOST_NO_CXX11_ALLOCATOR
349+# define BOOST_NO_CXX11_SMART_PTR
350+# define BOOST_NO_CXX11_HDR_FUNCTIONAL
351+# define BOOST_NO_CXX11_STD_ALIGN
352+# define BOOST_NO_CXX11_ADDRESSOF
353+#endif
354+
355+//
356+// These appear to be unusable/incomplete so far:
357+//
358+# define BOOST_NO_CXX11_HDR_CHRONO
359+# define BOOST_NO_CXX11_HDR_FUTURE
360+# define BOOST_NO_CXX11_HDR_TYPE_TRAITS
361+# define BOOST_NO_CXX11_ATOMIC_SMART_PTR
362+# define BOOST_NO_CXX11_HDR_ATOMIC
363+
364+// libc++ uses a non-standard messages_base
365+#define BOOST_NO_STD_MESSAGES
366+
367+#if defined(__has_include)
368+#if !__has_include(<shared_mutex>)
369+# define BOOST_NO_CXX14_HDR_SHARED_MUTEX
370+#elif __cplusplus <= 201103
371+# define BOOST_NO_CXX14_HDR_SHARED_MUTEX
372+#endif
373+#elif __cplusplus < 201402
374+# define BOOST_NO_CXX14_HDR_SHARED_MUTEX
375+#endif
376+
377+// --- end ---
378--- /dev/null
379+++ b/lib/boost/cstdint.hpp
380@@ -0,0 +1,542 @@
381+// boost cstdint.hpp header file ------------------------------------------//
382+
383+// (C) Copyright Beman Dawes 1999.
384+// (C) Copyright Jens Mauer 2001
385+// (C) Copyright John Maddock 2001
386+// Distributed under the Boost
387+// Software License, Version 1.0. (See accompanying file
388+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
389+
390+// See http://www.boost.org/libs/integer for documentation.
391+
392+// Revision History
393+// 31 Oct 01 use BOOST_HAS_LONG_LONG to check for "long long" (Jens M.)
394+// 16 Apr 01 check LONGLONG_MAX when looking for "long long" (Jens Maurer)
395+// 23 Jan 01 prefer "long" over "int" for int32_t and intmax_t (Jens Maurer)
396+// 12 Nov 00 Merged <boost/stdint.h> (Jens Maurer)
397+// 23 Sep 00 Added INTXX_C macro support (John Maddock).
398+// 22 Sep 00 Better 64-bit support (John Maddock)
399+// 29 Jun 00 Reimplement to avoid including stdint.h within namespace boost
400+// 8 Aug 99 Initial version (Beman Dawes)
401+
402+
403+#ifndef BOOST_CSTDINT_HPP
404+#define BOOST_CSTDINT_HPP
405+
406+//
407+// Since we always define the INT#_C macros as per C++0x,
408+// define __STDC_CONSTANT_MACROS so that <stdint.h> does the right
409+// thing if possible, and so that the user knows that the macros
410+// are actually defined as per C99.
411+//
412+#ifndef __STDC_CONSTANT_MACROS
413+# define __STDC_CONSTANT_MACROS
414+#endif
415+
416+#include <boost/config.hpp>
417+
418+//
419+// Note that GLIBC is a bit inconsistent about whether int64_t is defined or not
420+// depending upon what headers happen to have been included first...
421+// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.
422+// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990
423+//
424+#if defined(BOOST_HAS_STDINT_H) \
425+ && (!defined(__GLIBC__) \
426+ || defined(__GLIBC_HAVE_LONG_LONG) \
427+ || (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))
428+
429+// The following #include is an implementation artifact; not part of interface.
430+# ifdef __hpux
431+// HP-UX has a vaguely nice <stdint.h> in a non-standard location
432+# include <inttypes.h>
433+# ifdef __STDC_32_MODE__
434+ // this is triggered with GCC, because it defines __cplusplus < 199707L
435+# define BOOST_NO_INT64_T
436+# endif
437+# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)
438+# include <inttypes.h>
439+# else
440+# include <stdint.h>
441+
442+// There is a bug in Cygwin two _C macros
443+# if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__)
444+# undef INTMAX_C
445+# undef UINTMAX_C
446+# define INTMAX_C(c) c##LL
447+# define UINTMAX_C(c) c##ULL
448+# endif
449+
450+# endif
451+
452+#ifdef __QNX__
453+
454+// QNX (Dinkumware stdlib) defines these as non-standard names.
455+// Reflect to the standard names.
456+
457+typedef ::intleast8_t int_least8_t;
458+typedef ::intfast8_t int_fast8_t;
459+typedef ::uintleast8_t uint_least8_t;
460+typedef ::uintfast8_t uint_fast8_t;
461+
462+typedef ::intleast16_t int_least16_t;
463+typedef ::intfast16_t int_fast16_t;
464+typedef ::uintleast16_t uint_least16_t;
465+typedef ::uintfast16_t uint_fast16_t;
466+
467+typedef ::intleast32_t int_least32_t;
468+typedef ::intfast32_t int_fast32_t;
469+typedef ::uintleast32_t uint_least32_t;
470+typedef ::uintfast32_t uint_fast32_t;
471+
472+# ifndef BOOST_NO_INT64_T
473+
474+typedef ::intleast64_t int_least64_t;
475+typedef ::intfast64_t int_fast64_t;
476+typedef ::uintleast64_t uint_least64_t;
477+typedef ::uintfast64_t uint_fast64_t;
478+
479+# endif
480+
481+#endif
482+
483+namespace boost
484+{
485+
486+ using ::int8_t;
487+ using ::int_least8_t;
488+ using ::int_fast8_t;
489+ using ::uint8_t;
490+ using ::uint_least8_t;
491+ using ::uint_fast8_t;
492+
493+ using ::int16_t;
494+ using ::int_least16_t;
495+ using ::int_fast16_t;
496+ using ::uint16_t;
497+ using ::uint_least16_t;
498+ using ::uint_fast16_t;
499+
500+ using ::int32_t;
501+ using ::int_least32_t;
502+ using ::int_fast32_t;
503+ using ::uint32_t;
504+ using ::uint_least32_t;
505+ using ::uint_fast32_t;
506+
507+# ifndef BOOST_NO_INT64_T
508+
509+ using ::int64_t;
510+ using ::int_least64_t;
511+ using ::int_fast64_t;
512+ using ::uint64_t;
513+ using ::uint_least64_t;
514+ using ::uint_fast64_t;
515+
516+# endif
517+
518+ using ::intmax_t;
519+ using ::uintmax_t;
520+
521+} // namespace boost
522+
523+#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS) || defined(__SOLARIS9__) || defined(__NetBSD__)
524+// FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need.
525+# include <inttypes.h>
526+
527+namespace boost {
528+
529+ using ::int8_t;
530+ typedef int8_t int_least8_t;
531+ typedef int8_t int_fast8_t;
532+ using ::uint8_t;
533+ typedef uint8_t uint_least8_t;
534+ typedef uint8_t uint_fast8_t;
535+
536+ using ::int16_t;
537+ typedef int16_t int_least16_t;
538+ typedef int16_t int_fast16_t;
539+ using ::uint16_t;
540+ typedef uint16_t uint_least16_t;
541+ typedef uint16_t uint_fast16_t;
542+
543+ using ::int32_t;
544+ typedef int32_t int_least32_t;
545+ typedef int32_t int_fast32_t;
546+ using ::uint32_t;
547+ typedef uint32_t uint_least32_t;
548+ typedef uint32_t uint_fast32_t;
549+
550+# ifndef BOOST_NO_INT64_T
551+
552+ using ::int64_t;
553+ typedef int64_t int_least64_t;
554+ typedef int64_t int_fast64_t;
555+ using ::uint64_t;
556+ typedef uint64_t uint_least64_t;
557+ typedef uint64_t uint_fast64_t;
558+
559+ typedef int64_t intmax_t;
560+ typedef uint64_t uintmax_t;
561+
562+# else
563+
564+ typedef int32_t intmax_t;
565+ typedef uint32_t uintmax_t;
566+
567+# endif
568+
569+} // namespace boost
570+
571+#else // BOOST_HAS_STDINT_H
572+
573+# include <boost/limits.hpp> // implementation artifact; not part of interface
574+# include <limits.h> // needed for limits macros
575+
576+
577+namespace boost
578+{
579+
580+// These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit
581+// platforms. For other systems, they will have to be hand tailored.
582+//
583+// Because the fast types are assumed to be the same as the undecorated types,
584+// it may be possible to hand tailor a more efficient implementation. Such
585+// an optimization may be illusionary; on the Intel x86-family 386 on, for
586+// example, byte arithmetic and load/stores are as fast as "int" sized ones.
587+
588+// 8-bit types ------------------------------------------------------------//
589+
590+# if UCHAR_MAX == 0xff
591+ typedef signed char int8_t;
592+ typedef signed char int_least8_t;
593+ typedef signed char int_fast8_t;
594+ typedef unsigned char uint8_t;
595+ typedef unsigned char uint_least8_t;
596+ typedef unsigned char uint_fast8_t;
597+# else
598+# error defaults not correct; you must hand modify boost/cstdint.hpp
599+# endif
600+
601+// 16-bit types -----------------------------------------------------------//
602+
603+# if USHRT_MAX == 0xffff
604+# if defined(__crayx1)
605+ // The Cray X1 has a 16-bit short, however it is not recommend
606+ // for use in performance critical code.
607+ typedef short int16_t;
608+ typedef short int_least16_t;
609+ typedef int int_fast16_t;
610+ typedef unsigned short uint16_t;
611+ typedef unsigned short uint_least16_t;
612+ typedef unsigned int uint_fast16_t;
613+# else
614+ typedef short int16_t;
615+ typedef short int_least16_t;
616+ typedef short int_fast16_t;
617+ typedef unsigned short uint16_t;
618+ typedef unsigned short uint_least16_t;
619+ typedef unsigned short uint_fast16_t;
620+# endif
621+# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__)
622+ // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified
623+ // MTA / XMT does support the following non-standard integer types
624+ typedef __short16 int16_t;
625+ typedef __short16 int_least16_t;
626+ typedef __short16 int_fast16_t;
627+ typedef unsigned __short16 uint16_t;
628+ typedef unsigned __short16 uint_least16_t;
629+ typedef unsigned __short16 uint_fast16_t;
630+# elif (USHRT_MAX == 0xffffffff) && defined(CRAY)
631+ // no 16-bit types on Cray:
632+ typedef short int_least16_t;
633+ typedef short int_fast16_t;
634+ typedef unsigned short uint_least16_t;
635+ typedef unsigned short uint_fast16_t;
636+# else
637+# error defaults not correct; you must hand modify boost/cstdint.hpp
638+# endif
639+
640+// 32-bit types -----------------------------------------------------------//
641+
642+# if UINT_MAX == 0xffffffff
643+ typedef int int32_t;
644+ typedef int int_least32_t;
645+ typedef int int_fast32_t;
646+ typedef unsigned int uint32_t;
647+ typedef unsigned int uint_least32_t;
648+ typedef unsigned int uint_fast32_t;
649+# elif (USHRT_MAX == 0xffffffff)
650+ typedef short int32_t;
651+ typedef short int_least32_t;
652+ typedef short int_fast32_t;
653+ typedef unsigned short uint32_t;
654+ typedef unsigned short uint_least32_t;
655+ typedef unsigned short uint_fast32_t;
656+# elif ULONG_MAX == 0xffffffff
657+ typedef long int32_t;
658+ typedef long int_least32_t;
659+ typedef long int_fast32_t;
660+ typedef unsigned long uint32_t;
661+ typedef unsigned long uint_least32_t;
662+ typedef unsigned long uint_fast32_t;
663+# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__)
664+ // Integers are 64 bits on the MTA / XMT
665+ typedef __int32 int32_t;
666+ typedef __int32 int_least32_t;
667+ typedef __int32 int_fast32_t;
668+ typedef unsigned __int32 uint32_t;
669+ typedef unsigned __int32 uint_least32_t;
670+ typedef unsigned __int32 uint_fast32_t;
671+# else
672+# error defaults not correct; you must hand modify boost/cstdint.hpp
673+# endif
674+
675+// 64-bit types + intmax_t and uintmax_t ----------------------------------//
676+
677+# if defined(BOOST_HAS_LONG_LONG) && \
678+ !defined(BOOST_MSVC) && !defined(__BORLANDC__) && \
679+ (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \
680+ (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
681+# if defined(__hpux)
682+ // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
683+# elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL)
684+ // 2**64 - 1
685+# else
686+# error defaults not correct; you must hand modify boost/cstdint.hpp
687+# endif
688+
689+ typedef ::boost::long_long_type intmax_t;
690+ typedef ::boost::ulong_long_type uintmax_t;
691+ typedef ::boost::long_long_type int64_t;
692+ typedef ::boost::long_long_type int_least64_t;
693+ typedef ::boost::long_long_type int_fast64_t;
694+ typedef ::boost::ulong_long_type uint64_t;
695+ typedef ::boost::ulong_long_type uint_least64_t;
696+ typedef ::boost::ulong_long_type uint_fast64_t;
697+
698+# elif ULONG_MAX != 0xffffffff
699+
700+# if ULONG_MAX == 18446744073709551615 // 2**64 - 1
701+ typedef long intmax_t;
702+ typedef unsigned long uintmax_t;
703+ typedef long int64_t;
704+ typedef long int_least64_t;
705+ typedef long int_fast64_t;
706+ typedef unsigned long uint64_t;
707+ typedef unsigned long uint_least64_t;
708+ typedef unsigned long uint_fast64_t;
709+# else
710+# error defaults not correct; you must hand modify boost/cstdint.hpp
711+# endif
712+# elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG)
713+ __extension__ typedef long long intmax_t;
714+ __extension__ typedef unsigned long long uintmax_t;
715+ __extension__ typedef long long int64_t;
716+ __extension__ typedef long long int_least64_t;
717+ __extension__ typedef long long int_fast64_t;
718+ __extension__ typedef unsigned long long uint64_t;
719+ __extension__ typedef unsigned long long uint_least64_t;
720+ __extension__ typedef unsigned long long uint_fast64_t;
721+# elif defined(BOOST_HAS_MS_INT64)
722+ //
723+ // we have Borland/Intel/Microsoft __int64:
724+ //
725+ typedef __int64 intmax_t;
726+ typedef unsigned __int64 uintmax_t;
727+ typedef __int64 int64_t;
728+ typedef __int64 int_least64_t;
729+ typedef __int64 int_fast64_t;
730+ typedef unsigned __int64 uint64_t;
731+ typedef unsigned __int64 uint_least64_t;
732+ typedef unsigned __int64 uint_fast64_t;
733+# else // assume no 64-bit integers
734+# define BOOST_NO_INT64_T
735+ typedef int32_t intmax_t;
736+ typedef uint32_t uintmax_t;
737+# endif
738+
739+} // namespace boost
740+
741+
742+#endif // BOOST_HAS_STDINT_H
743+
744+// intptr_t/uintptr_t are defined separately because they are optional and not universally available
745+#if defined(BOOST_WINDOWS) && !defined(_WIN32_WCE) && !defined(BOOST_HAS_STDINT_H)
746+// Older MSVC don't have stdint.h and have intptr_t/uintptr_t defined in stddef.h
747+#include <stddef.h>
748+#endif
749+
750+// PGI seems to not support intptr_t/uintptr_t properly. BOOST_HAS_STDINT_H is not defined for this compiler by Boost.Config.
751+#if !defined(__PGIC__)
752+
753+#if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \
754+ || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \
755+ || defined(__CYGWIN__) \
756+ || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \
757+ || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun)
758+
759+namespace boost {
760+ using ::intptr_t;
761+ using ::uintptr_t;
762+}
763+#define BOOST_HAS_INTPTR_T
764+
765+// Clang pretends to be GCC, so it'll match this condition
766+#elif defined(__GNUC__) && defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)
767+
768+namespace boost {
769+ typedef __INTPTR_TYPE__ intptr_t;
770+ typedef __UINTPTR_TYPE__ uintptr_t;
771+}
772+#define BOOST_HAS_INTPTR_T
773+
774+#endif
775+
776+#endif // !defined(__PGIC__)
777+
778+#endif // BOOST_CSTDINT_HPP
779+
780+
781+/****************************************************
782+
783+Macro definition section:
784+
785+Added 23rd September 2000 (John Maddock).
786+Modified 11th September 2001 to be excluded when
787+BOOST_HAS_STDINT_H is defined (John Maddock).
788+Modified 11th Dec 2009 to always define the
789+INT#_C macros if they're not already defined (John Maddock).
790+
791+******************************************************/
792+
793+#if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \
794+ (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C))
795+//
796+// For the following code we get several warnings along the lines of:
797+//
798+// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant
799+//
800+// So we declare this a system header to suppress these warnings.
801+//
802+#if defined(__GNUC__) && (__GNUC__ >= 4)
803+#pragma GCC system_header
804+#endif
805+
806+#include <limits.h>
807+# define BOOST__STDC_CONSTANT_MACROS_DEFINED
808+# if defined(BOOST_HAS_MS_INT64)
809+//
810+// Borland/Intel/Microsoft compilers have width specific suffixes:
811+//
812+#ifndef INT8_C
813+# define INT8_C(value) value##i8
814+#endif
815+#ifndef INT16_C
816+# define INT16_C(value) value##i16
817+#endif
818+#ifndef INT32_C
819+# define INT32_C(value) value##i32
820+#endif
821+#ifndef INT64_C
822+# define INT64_C(value) value##i64
823+#endif
824+# ifdef __BORLANDC__
825+ // Borland bug: appending ui8 makes the type a signed char
826+# define UINT8_C(value) static_cast<unsigned char>(value##u)
827+# else
828+# define UINT8_C(value) value##ui8
829+# endif
830+#ifndef UINT16_C
831+# define UINT16_C(value) value##ui16
832+#endif
833+#ifndef UINT32_C
834+# define UINT32_C(value) value##ui32
835+#endif
836+#ifndef UINT64_C
837+# define UINT64_C(value) value##ui64
838+#endif
839+#ifndef INTMAX_C
840+# define INTMAX_C(value) value##i64
841+# define UINTMAX_C(value) value##ui64
842+#endif
843+
844+# else
845+// do it the old fashioned way:
846+
847+// 8-bit types ------------------------------------------------------------//
848+
849+# if (UCHAR_MAX == 0xff) && !defined(INT8_C)
850+# define INT8_C(value) static_cast<boost::int8_t>(value)
851+# define UINT8_C(value) static_cast<boost::uint8_t>(value##u)
852+# endif
853+
854+// 16-bit types -----------------------------------------------------------//
855+
856+# if (USHRT_MAX == 0xffff) && !defined(INT16_C)
857+# define INT16_C(value) static_cast<boost::int16_t>(value)
858+# define UINT16_C(value) static_cast<boost::uint16_t>(value##u)
859+# endif
860+
861+// 32-bit types -----------------------------------------------------------//
862+#ifndef INT32_C
863+# if (UINT_MAX == 0xffffffff)
864+# define INT32_C(value) value
865+# define UINT32_C(value) value##u
866+# elif ULONG_MAX == 0xffffffff
867+# define INT32_C(value) value##L
868+# define UINT32_C(value) value##uL
869+# endif
870+#endif
871+
872+// 64-bit types + intmax_t and uintmax_t ----------------------------------//
873+#ifndef INT64_C
874+# if defined(BOOST_HAS_LONG_LONG) && \
875+ (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_ULLONG_MAX) || defined(_LLONG_MAX))
876+
877+# if defined(__hpux)
878+ // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
879+# define INT64_C(value) value##LL
880+# define UINT64_C(value) value##uLL
881+# elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || \
882+ (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || \
883+ (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \
884+ (defined(_ULLONG_MAX) && _ULLONG_MAX == 18446744073709551615ULL) || \
885+ (defined(_LLONG_MAX) && _LLONG_MAX == 9223372036854775807LL)
886+
887+# define INT64_C(value) value##LL
888+# define UINT64_C(value) value##uLL
889+# else
890+# error defaults not correct; you must hand modify boost/cstdint.hpp
891+# endif
892+# elif ULONG_MAX != 0xffffffff
893+
894+# if ULONG_MAX == 18446744073709551615U // 2**64 - 1
895+# define INT64_C(value) value##L
896+# define UINT64_C(value) value##uL
897+# else
898+# error defaults not correct; you must hand modify boost/cstdint.hpp
899+# endif
900+# elif defined(BOOST_HAS_LONG_LONG)
901+ // Usual macros not defined, work things out for ourselves:
902+# if(~0uLL == 18446744073709551615ULL)
903+# define INT64_C(value) value##LL
904+# define UINT64_C(value) value##uLL
905+# else
906+# error defaults not correct; you must hand modify boost/cstdint.hpp
907+# endif
908+# else
909+# error defaults not correct; you must hand modify boost/cstdint.hpp
910+# endif
911+
912+# ifdef BOOST_NO_INT64_T
913+# define INTMAX_C(value) INT32_C(value)
914+# define UINTMAX_C(value) UINT32_C(value)
915+# else
916+# define INTMAX_C(value) INT64_C(value)
917+# define UINTMAX_C(value) UINT64_C(value)
918+# endif
919+#endif
920+# endif // Borland/Microsoft specific width suffixes
921+
922+#endif // INT#_C macros.
923--- /dev/null
924+++ b/lib/boost/smart_ptr/detail/sp_counted_base_clang.hpp
925@@ -0,0 +1,140 @@
926+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
927+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
928+
929+// MS compatible compilers support #pragma once
930+
931+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
932+# pragma once
933+#endif
934+
935+// detail/sp_counted_base_clang.hpp - __c11 clang intrinsics
936+//
937+// Copyright (c) 2007, 2013, 2015 Peter Dimov
938+//
939+// Distributed under the Boost Software License, Version 1.0.
940+// See accompanying file LICENSE_1_0.txt or copy at
941+// http://www.boost.org/LICENSE_1_0.txt
942+
943+#include <boost/detail/sp_typeinfo.hpp>
944+#include <boost/cstdint.hpp>
945+
946+namespace boost
947+{
948+
949+namespace detail
950+{
951+
952+typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
953+
954+inline void atomic_increment( atomic_int_least32_t * pw )
955+{
956+ __c11_atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
957+}
958+
959+inline boost::int_least32_t atomic_decrement( atomic_int_least32_t * pw )
960+{
961+ return __c11_atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
962+}
963+
964+inline boost::int_least32_t atomic_conditional_increment( atomic_int_least32_t * pw )
965+{
966+ // long r = *pw;
967+ // if( r != 0 ) ++*pw;
968+ // return r;
969+
970+ boost::int_least32_t r = __c11_atomic_load( pw, __ATOMIC_RELAXED );
971+
972+ for( ;; )
973+ {
974+ if( r == 0 )
975+ {
976+ return r;
977+ }
978+
979+ if( __c11_atomic_compare_exchange_weak( pw, &r, r + 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
980+ {
981+ return r;
982+ }
983+ }
984+}
985+
986+class sp_counted_base
987+{
988+private:
989+
990+ sp_counted_base( sp_counted_base const & );
991+ sp_counted_base & operator= ( sp_counted_base const & );
992+
993+ atomic_int_least32_t use_count_; // #shared
994+ atomic_int_least32_t weak_count_; // #weak + (#shared != 0)
995+
996+public:
997+
998+ sp_counted_base()
999+ {
1000+ __c11_atomic_init( &use_count_, 1 );
1001+ __c11_atomic_init( &weak_count_, 1 );
1002+ }
1003+
1004+ virtual ~sp_counted_base() // nothrow
1005+ {
1006+ }
1007+
1008+ // dispose() is called when use_count_ drops to zero, to release
1009+ // the resources managed by *this.
1010+
1011+ virtual void dispose() = 0; // nothrow
1012+
1013+ // destroy() is called when weak_count_ drops to zero.
1014+
1015+ virtual void destroy() // nothrow
1016+ {
1017+ delete this;
1018+ }
1019+
1020+ virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
1021+ virtual void * get_untyped_deleter() = 0;
1022+
1023+ void add_ref_copy()
1024+ {
1025+ atomic_increment( &use_count_ );
1026+ }
1027+
1028+ bool add_ref_lock() // true on success
1029+ {
1030+ return atomic_conditional_increment( &use_count_ ) != 0;
1031+ }
1032+
1033+ void release() // nothrow
1034+ {
1035+ if( atomic_decrement( &use_count_ ) == 1 )
1036+ {
1037+ dispose();
1038+ weak_release();
1039+ }
1040+ }
1041+
1042+ void weak_add_ref() // nothrow
1043+ {
1044+ atomic_increment( &weak_count_ );
1045+ }
1046+
1047+ void weak_release() // nothrow
1048+ {
1049+ if( atomic_decrement( &weak_count_ ) == 1 )
1050+ {
1051+ destroy();
1052+ }
1053+ }
1054+
1055+ long use_count() const // nothrow
1056+ {
1057+ return __c11_atomic_load( const_cast< atomic_int_least32_t* >( &use_count_ ), __ATOMIC_ACQUIRE );
1058+ }
1059+};
1060+
1061+} // namespace detail
1062+
1063+} // namespace boost
1064+
1065+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
1066--- /dev/null
1067+++ b/lib/boost/smart_ptr/detail/sp_counted_base_sync.hpp
1068@@ -0,0 +1,156 @@
1069+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
1070+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
1071+
1072+// MS compatible compilers support #pragma once
1073+
1074+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
1075+# pragma once
1076+#endif
1077+
1078+// detail/sp_counted_base_sync.hpp - g++ 4.1+ __sync intrinsics
1079+//
1080+// Copyright (c) 2007 Peter Dimov
1081+//
1082+// Distributed under the Boost Software License, Version 1.0.
1083+// See accompanying file LICENSE_1_0.txt or copy at
1084+// http://www.boost.org/LICENSE_1_0.txt
1085+
1086+#include <boost/detail/sp_typeinfo.hpp>
1087+#include <limits.h>
1088+
1089+#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
1090+# include <ia64intrin.h>
1091+#endif
1092+
1093+namespace boost
1094+{
1095+
1096+namespace detail
1097+{
1098+
1099+#if INT_MAX >= 2147483647
1100+
1101+typedef int sp_int32_t;
1102+
1103+#else
1104+
1105+typedef long sp_int32_t;
1106+
1107+#endif
1108+
1109+inline void atomic_increment( sp_int32_t * pw )
1110+{
1111+ __sync_fetch_and_add( pw, 1 );
1112+}
1113+
1114+inline sp_int32_t atomic_decrement( sp_int32_t * pw )
1115+{
1116+ return __sync_fetch_and_add( pw, -1 );
1117+}
1118+
1119+inline sp_int32_t atomic_conditional_increment( sp_int32_t * pw )
1120+{
1121+ // long r = *pw;
1122+ // if( r != 0 ) ++*pw;
1123+ // return r;
1124+
1125+ sp_int32_t r = *pw;
1126+
1127+ for( ;; )
1128+ {
1129+ if( r == 0 )
1130+ {
1131+ return r;
1132+ }
1133+
1134+ sp_int32_t r2 = __sync_val_compare_and_swap( pw, r, r + 1 );
1135+
1136+ if( r2 == r )
1137+ {
1138+ return r;
1139+ }
1140+ else
1141+ {
1142+ r = r2;
1143+ }
1144+ }
1145+}
1146+
1147+class sp_counted_base
1148+{
1149+private:
1150+
1151+ sp_counted_base( sp_counted_base const & );
1152+ sp_counted_base & operator= ( sp_counted_base const & );
1153+
1154+ sp_int32_t use_count_; // #shared
1155+ sp_int32_t weak_count_; // #weak + (#shared != 0)
1156+
1157+public:
1158+
1159+ sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
1160+ {
1161+ }
1162+
1163+ virtual ~sp_counted_base() // nothrow
1164+ {
1165+ }
1166+
1167+ // dispose() is called when use_count_ drops to zero, to release
1168+ // the resources managed by *this.
1169+
1170+ virtual void dispose() = 0; // nothrow
1171+
1172+ // destroy() is called when weak_count_ drops to zero.
1173+
1174+ virtual void destroy() // nothrow
1175+ {
1176+ delete this;
1177+ }
1178+
1179+ virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
1180+ virtual void * get_untyped_deleter() = 0;
1181+
1182+ void add_ref_copy()
1183+ {
1184+ atomic_increment( &use_count_ );
1185+ }
1186+
1187+ bool add_ref_lock() // true on success
1188+ {
1189+ return atomic_conditional_increment( &use_count_ ) != 0;
1190+ }
1191+
1192+ void release() // nothrow
1193+ {
1194+ if( atomic_decrement( &use_count_ ) == 1 )
1195+ {
1196+ dispose();
1197+ weak_release();
1198+ }
1199+ }
1200+
1201+ void weak_add_ref() // nothrow
1202+ {
1203+ atomic_increment( &weak_count_ );
1204+ }
1205+
1206+ void weak_release() // nothrow
1207+ {
1208+ if( atomic_decrement( &weak_count_ ) == 1 )
1209+ {
1210+ destroy();
1211+ }
1212+ }
1213+
1214+ long use_count() const // nothrow
1215+ {
1216+ return const_cast< sp_int32_t const volatile & >( use_count_ );
1217+ }
1218+};
1219+
1220+} // namespace detail
1221+
1222+} // namespace boost
1223+
1224+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
1225--- /dev/null
1226+++ b/lib/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp
1227@@ -0,0 +1,182 @@
1228+#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
1229+#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
1230+
1231+// MS compatible compilers support #pragma once
1232+
1233+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
1234+# pragma once
1235+#endif
1236+
1237+//
1238+// detail/sp_counted_base_gcc_mips.hpp - g++ on MIPS
1239+//
1240+// Copyright (c) 2009, Spirent Communications, Inc.
1241+//
1242+// Distributed under the Boost Software License, Version 1.0. (See
1243+// accompanying file LICENSE_1_0.txt or copy at
1244+// http://www.boost.org/LICENSE_1_0.txt)
1245+//
1246+//
1247+// Lock-free algorithm by Alexander Terekhov
1248+//
1249+
1250+#include <boost/detail/sp_typeinfo.hpp>
1251+
1252+namespace boost
1253+{
1254+
1255+namespace detail
1256+{
1257+
1258+inline void atomic_increment( int * pw )
1259+{
1260+ // ++*pw;
1261+
1262+ int tmp;
1263+
1264+ __asm__ __volatile__
1265+ (
1266+ "0:\n\t"
1267+ ".set push\n\t"
1268+ ".set mips2\n\t"
1269+ "ll %0, %1\n\t"
1270+ "addiu %0, 1\n\t"
1271+ "sc %0, %1\n\t"
1272+ ".set pop\n\t"
1273+ "beqz %0, 0b":
1274+ "=&r"( tmp ), "=m"( *pw ):
1275+ "m"( *pw )
1276+ );
1277+}
1278+
1279+inline int atomic_decrement( int * pw )
1280+{
1281+ // return --*pw;
1282+
1283+ int rv, tmp;
1284+
1285+ __asm__ __volatile__
1286+ (
1287+ "0:\n\t"
1288+ ".set push\n\t"
1289+ ".set mips2\n\t"
1290+ "ll %1, %2\n\t"
1291+ "addiu %0, %1, -1\n\t"
1292+ "sc %0, %2\n\t"
1293+ ".set pop\n\t"
1294+ "beqz %0, 0b\n\t"
1295+ "addiu %0, %1, -1":
1296+ "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
1297+ "m"( *pw ):
1298+ "memory"
1299+ );
1300+
1301+ return rv;
1302+}
1303+
1304+inline int atomic_conditional_increment( int * pw )
1305+{
1306+ // if( *pw != 0 ) ++*pw;
1307+ // return *pw;
1308+
1309+ int rv, tmp;
1310+
1311+ __asm__ __volatile__
1312+ (
1313+ "0:\n\t"
1314+ ".set push\n\t"
1315+ ".set mips2\n\t"
1316+ "ll %0, %2\n\t"
1317+ "beqz %0, 1f\n\t"
1318+ "addiu %1, %0, 1\n\t"
1319+ "sc %1, %2\n\t"
1320+ ".set pop\n\t"
1321+ "beqz %1, 0b\n\t"
1322+ "addiu %0, %0, 1\n\t"
1323+ "1:":
1324+ "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
1325+ "m"( *pw ):
1326+ "memory"
1327+ );
1328+
1329+ return rv;
1330+}
1331+
1332+class sp_counted_base
1333+{
1334+private:
1335+
1336+ sp_counted_base( sp_counted_base const & );
1337+ sp_counted_base & operator= ( sp_counted_base const & );
1338+
1339+ int use_count_; // #shared
1340+ int weak_count_; // #weak + (#shared != 0)
1341+
1342+public:
1343+
1344+ sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
1345+ {
1346+ }
1347+
1348+ virtual ~sp_counted_base() // nothrow
1349+ {
1350+ }
1351+
1352+ // dispose() is called when use_count_ drops to zero, to release
1353+ // the resources managed by *this.
1354+
1355+ virtual void dispose() = 0; // nothrow
1356+
1357+ // destroy() is called when weak_count_ drops to zero.
1358+
1359+ virtual void destroy() // nothrow
1360+ {
1361+ delete this;
1362+ }
1363+
1364+ virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
1365+ virtual void * get_untyped_deleter() = 0;
1366+
1367+ void add_ref_copy()
1368+ {
1369+ atomic_increment( &use_count_ );
1370+ }
1371+
1372+ bool add_ref_lock() // true on success
1373+ {
1374+ return atomic_conditional_increment( &use_count_ ) != 0;
1375+ }
1376+
1377+ void release() // nothrow
1378+ {
1379+ if( atomic_decrement( &use_count_ ) == 0 )
1380+ {
1381+ dispose();
1382+ weak_release();
1383+ }
1384+ }
1385+
1386+ void weak_add_ref() // nothrow
1387+ {
1388+ atomic_increment( &weak_count_ );
1389+ }
1390+
1391+ void weak_release() // nothrow
1392+ {
1393+ if( atomic_decrement( &weak_count_ ) == 0 )
1394+ {
1395+ destroy();
1396+ }
1397+ }
1398+
1399+ long use_count() const // nothrow
1400+ {
1401+ return static_cast<int const volatile &>( use_count_ );
1402+ }
1403+};
1404+
1405+} // namespace detail
1406+
1407+} // namespace boost
1408+
1409+#endif // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED