Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r76554 - sandbox/closure
From: lorcaminiti_at_[hidden]
Date: 2012-01-17 10:29:44


Author: lcaminiti
Date: 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
New Revision: 76554
URL: http://svn.boost.org/trac/boost/changeset/76554

Log:
Cleaning root dir.
Added:
   sandbox/closure/00.cpp (contents, props changed)
   sandbox/closure/01.cpp (contents, props changed)
   sandbox/closure/02.cpp (contents, props changed)
   sandbox/closure/03.cpp (contents, props changed)
   sandbox/closure/04.cpp (contents, props changed)
   sandbox/closure/05.cpp (contents, props changed)
   sandbox/closure/06.cpp (contents, props changed)
   sandbox/closure/16.cpp (contents, props changed)
   sandbox/closure/b01.cpp (contents, props changed)
   sandbox/closure/buff01.cpp (contents, props changed)
   sandbox/closure/c01.cpp (contents, props changed)
   sandbox/closure/example_add.cpp (contents, props changed)
   sandbox/closure/example_add_lambda.cpp (contents, props changed)
   sandbox/closure/example_gcc_lambda.cpp (contents, props changed)
   sandbox/closure/example_gcc_lambda_cpp11.cpp (contents, props changed)
   sandbox/closure/f01.cpp (contents, props changed)
   sandbox/closure/f02.cpp (contents, props changed)
   sandbox/closure/f03.cpp (contents, props changed)
   sandbox/closure/f04.cpp (contents, props changed)
   sandbox/closure/f05.cpp (contents, props changed)
   sandbox/closure/f06.cpp (contents, props changed)
   sandbox/closure/f07.cpp (contents, props changed)
   sandbox/closure/gcc_lambda.hpp (contents, props changed)
   sandbox/closure/loctparam.cpp (contents, props changed)
   sandbox/closure/proxy.hpp (contents, props changed)
   sandbox/closure/proxy_ptr.hpp (contents, props changed)
   sandbox/closure/sep01.cpp (contents, props changed)
   sandbox/closure/separate.hpp (contents, props changed)
   sandbox/closure/separate_ptr.hpp (contents, props changed)
   sandbox/closure/test_add.cpp (contents, props changed)
   sandbox/closure/test_add_lambda.cpp (contents, props changed)
   sandbox/closure/test_add_seq.cpp (contents, props changed)
   sandbox/closure/test_offset.cpp (contents, props changed)

Added: sandbox/closure/00.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/00.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,272924 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef __w64 unsigned int uintptr_t;
+
+
+
+
+
+
+
+
+typedef char * va_list;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef __w64 unsigned int size_t;
+
+
+
+
+
+
+typedef size_t rsize_t;
+
+
+
+
+
+
+
+
+typedef __w64 int intptr_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef __w64 int ptrdiff_t;
+
+
+
+
+
+
+
+
+
+
+typedef unsigned short wint_t;
+typedef unsigned short wctype_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("This name was supported during some Whidbey pre-releases. Instead, use the standard name errno_t.")) typedef int errcode;
+
+
+
+
+typedef int errno_t;
+
+
+
+typedef __w64 long __time32_t;
+
+
+
+
+
+typedef __int64 __time64_t;
+
+
+
+
+
+
+
+
+typedef __time64_t time_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct threadlocaleinfostruct;
+struct threadmbcinfostruct;
+typedef struct threadlocaleinfostruct * pthreadlocinfo;
+typedef struct threadmbcinfostruct * pthreadmbcinfo;
+struct __lc_time_data;
+
+typedef struct localeinfo_struct
+{
+ pthreadlocinfo locinfo;
+ pthreadmbcinfo mbcinfo;
+} _locale_tstruct, *_locale_t;
+
+
+typedef struct tagLC_ID {
+ unsigned short wLanguage;
+ unsigned short wCountry;
+ unsigned short wCodePage;
+} LC_ID, *LPLC_ID;
+
+
+
+
+typedef struct threadlocaleinfostruct {
+ int refcount;
+ unsigned int lc_codepage;
+ unsigned int lc_collate_cp;
+ unsigned long lc_handle[6];
+ LC_ID lc_id[6];
+ struct {
+ char *locale;
+ wchar_t *wlocale;
+ int *refcount;
+ int *wrefcount;
+ } lc_category[6];
+ int lc_clike;
+ int mb_cur_max;
+ int * lconv_intl_refcount;
+ int * lconv_num_refcount;
+ int * lconv_mon_refcount;
+ struct lconv * lconv;
+ int * ctype1_refcount;
+ unsigned short * ctype1;
+ const unsigned short * pctype;
+ const unsigned char * pclmap;
+ const unsigned char * pcumap;
+ struct __lc_time_data * lc_time_curr;
+} threadlocinfo;
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma comment(lib,"libcpmt")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+typedef bool _Bool;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef __int64 _Longlong;
+typedef unsigned __int64 _ULonglong;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4412)
+class _Lockit
+ {
+public:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ explicit __thiscall _Lockit();
+ explicit __thiscall _Lockit(int);
+ __thiscall ~_Lockit();
+
+
+ static void __cdecl _Lockit_ctor(int);
+ static void __cdecl _Lockit_dtor(int);
+
+private:
+ static void __cdecl _Lockit_ctor(_Lockit *);
+ static void __cdecl _Lockit_ctor(_Lockit *, int);
+ static void __cdecl _Lockit_dtor(_Lockit *);
+
+ _Lockit(const _Lockit&);
+ _Lockit& operator=(const _Lockit&);
+
+ int _Locktype;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class _Mutex
+ {
+public:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __thiscall _Mutex();
+ __thiscall ~_Mutex();
+ void __thiscall _Lock();
+ void __thiscall _Unlock();
+
+
+private:
+ static void __cdecl _Mutex_ctor(_Mutex *);
+ static void __cdecl _Mutex_dtor(_Mutex *);
+ static void __cdecl _Mutex_Lock(_Mutex *);
+ static void __cdecl _Mutex_Unlock(_Mutex *);
+
+ _Mutex(const _Mutex&);
+ _Mutex& operator=(const _Mutex&);
+ void *_Mtx;
+
+
+
+
+
+
+
+
+
+
+
+ };
+
+class _Init_locks
+ {
+public:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __thiscall _Init_locks();
+ __thiscall ~_Init_locks();
+
+
+private:
+ static void __cdecl _Init_locks_ctor(_Init_locks *);
+ static void __cdecl _Init_locks_dtor(_Init_locks *);
+
+
+
+
+
+
+
+
+
+
+
+ };
+#pragma warning(pop)
+}
+
+
+
+
+
+
+
+
+ void __cdecl _Atexit(void (__cdecl *)(void));
+
+typedef int _Mbstatet;
+
+
+
+
+
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern int * __cdecl _errno(void);
+
+
+errno_t __cdecl _set_errno( int _Value);
+errno_t __cdecl _get_errno( int * _Value);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern unsigned long __cdecl __threadid(void);
+
+ extern uintptr_t __cdecl __threadhandle(void);
+
+
+
+
+}
+
+
+
+
+
+
+
+namespace std {
+using ::ptrdiff_t; using ::size_t;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+enum _Uninitialized
+ {
+ _Noinit};
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+ #pragma warning(disable: 4244)
+
+
+namespace std {
+
+
+template<class _Arg,
+ class _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+
+
+template<class _Arg1,
+ class _Arg2,
+ class _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+
+
+template<class _Ty>
+ struct plus
+ : public binary_function<_Ty, _Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left + _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct minus
+ : public binary_function<_Ty, _Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left - _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct multiplies
+ : public binary_function<_Ty, _Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left * _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct divides
+ : public binary_function<_Ty, _Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left / _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct modulus
+ : public binary_function<_Ty, _Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left % _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct negate
+ : public unary_function<_Ty, _Ty>
+ {
+ _Ty operator()(const _Ty& _Left) const
+ {
+ return (-_Left);
+ }
+ };
+
+
+template<class _Ty>
+ struct equal_to
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left == _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct not_equal_to
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left != _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct greater
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left > _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct less
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left < _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct greater_equal
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left >= _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct less_equal
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left <= _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct logical_and
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left && _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct logical_or
+ : public binary_function<_Ty, _Ty, bool>
+ {
+ bool operator()(const _Ty& _Left, const _Ty& _Right) const
+ {
+ return (_Left || _Right);
+ }
+ };
+
+
+template<class _Ty>
+ struct logical_not
+ : public unary_function<_Ty, bool>
+ {
+ bool operator()(const _Ty& _Left) const
+ {
+ return (!_Left);
+ }
+ };
+
+
+template<class _Fn1>
+ class unary_negate
+ : public unary_function<typename _Fn1::argument_type, bool>
+ {
+public:
+ explicit unary_negate(const _Fn1& _Func)
+ : _Functor(_Func)
+ {
+ }
+
+ bool operator()(const typename _Fn1::argument_type& _Left) const
+ {
+ return (!_Functor(_Left));
+ }
+
+protected:
+ _Fn1 _Functor;
+ };
+
+
+template<class _Fn1> inline
+ unary_negate<_Fn1> not1(const _Fn1& _Func)
+ {
+ return (std::unary_negate<_Fn1>(_Func));
+ }
+
+
+template<class _Fn2>
+ class binary_negate
+ : public binary_function<typename _Fn2::first_argument_type,
+ typename _Fn2::second_argument_type, bool>
+ {
+public:
+ explicit binary_negate(const _Fn2& _Func)
+ : _Functor(_Func)
+ {
+ }
+
+ bool operator()(const typename _Fn2::first_argument_type& _Left,
+ const typename _Fn2::second_argument_type& _Right) const
+ {
+ return (!_Functor(_Left, _Right));
+ }
+
+protected:
+ _Fn2 _Functor;
+ };
+
+
+template<class _Fn2> inline
+ binary_negate<_Fn2> not2(const _Fn2& _Func)
+ {
+ return (std::binary_negate<_Fn2>(_Func));
+ }
+
+
+template<class _Fn2>
+ class binder1st
+ : public unary_function<typename _Fn2::second_argument_type,
+ typename _Fn2::result_type>
+ {
+public:
+ typedef unary_function<typename _Fn2::second_argument_type,
+ typename _Fn2::result_type> _Base;
+ typedef typename _Base::argument_type argument_type;
+ typedef typename _Base::result_type result_type;
+
+ binder1st(const _Fn2& _Func,
+ const typename _Fn2::first_argument_type& _Left)
+ : op(_Func), value(_Left)
+ {
+ }
+
+ result_type operator()(const argument_type& _Right) const
+ {
+ return (op(value, _Right));
+ }
+
+ result_type operator()(argument_type& _Right) const
+ {
+ return (op(value, _Right));
+ }
+
+protected:
+ _Fn2 op;
+ typename _Fn2::first_argument_type value;
+ };
+
+
+template<class _Fn2,
+ class _Ty> inline
+ binder1st<_Fn2> bind1st(const _Fn2& _Func, const _Ty& _Left)
+ {
+ typename _Fn2::first_argument_type _Val(_Left);
+ return (std::binder1st<_Fn2>(_Func, _Val));
+ }
+
+
+template<class _Fn2>
+ class binder2nd
+ : public unary_function<typename _Fn2::first_argument_type,
+ typename _Fn2::result_type>
+ {
+public:
+ typedef unary_function<typename _Fn2::first_argument_type,
+ typename _Fn2::result_type> _Base;
+ typedef typename _Base::argument_type argument_type;
+ typedef typename _Base::result_type result_type;
+
+ binder2nd(const _Fn2& _Func,
+ const typename _Fn2::second_argument_type& _Right)
+ : op(_Func), value(_Right)
+ {
+ }
+
+ result_type operator()(const argument_type& _Left) const
+ {
+ return (op(_Left, value));
+ }
+
+ result_type operator()(argument_type& _Left) const
+ {
+ return (op(_Left, value));
+ }
+
+protected:
+ _Fn2 op;
+ typename _Fn2::second_argument_type value;
+ };
+
+
+template<class _Fn2,
+ class _Ty> inline
+ binder2nd<_Fn2> bind2nd(const _Fn2& _Func, const _Ty& _Right)
+ {
+ typename _Fn2::second_argument_type _Val(_Right);
+ return (std::binder2nd<_Fn2>(_Func, _Val));
+ }
+
+
+template<class _Arg,
+ class _Result,
+ class _Fn = _Result (*)(_Arg)>
+ class pointer_to_unary_function
+ : public unary_function<_Arg, _Result>
+ {
+public:
+ explicit pointer_to_unary_function(_Fn _Left)
+ : _Pfun(_Left)
+ {
+ }
+
+ _Result operator()(_Arg _Left) const
+ {
+ return (_Pfun(_Left));
+ }
+
+protected:
+ _Fn _Pfun;
+ };
+
+
+template<class _Arg1,
+ class _Arg2,
+ class _Result,
+ class _Fn = _Result (*)(_Arg1, _Arg2)>
+ class pointer_to_binary_function
+ : public binary_function<_Arg1, _Arg2, _Result>
+ {
+public:
+ explicit pointer_to_binary_function(_Fn _Left)
+ : _Pfun(_Left)
+ {
+ }
+
+ _Result operator()(_Arg1 _Left, _Arg2 _Right) const
+ {
+ return (_Pfun(_Left, _Right));
+ }
+
+protected:
+ _Fn _Pfun;
+ };
+
+
+template<class _Arg,
+ class _Result> inline
+ pointer_to_unary_function<_Arg, _Result, _Result (__cdecl *)(_Arg)>
+ ptr_fun(_Result (__cdecl *_Left)(_Arg))
+ {
+ return (std::pointer_to_unary_function<_Arg, _Result, _Result (__cdecl *)(_Arg)>(_Left));
+ }
+
+
+template<class _Arg,
+ class _Result> inline
+ pointer_to_unary_function<_Arg, _Result,
+ _Result (__stdcall *)(_Arg)>
+ ptr_fun(_Result (__stdcall *_Left)(_Arg))
+ {
+ return (std::pointer_to_unary_function<_Arg, _Result, _Result (__stdcall *)(_Arg)>(_Left));
+ }
+
+
+template<class _Arg,
+ class _Result> inline
+ pointer_to_unary_function<_Arg, _Result,
+ _Result (__fastcall *)(_Arg)>
+ ptr_fun(_Result (__fastcall *_Left)(_Arg))
+ {
+ return (std::pointer_to_unary_function<_Arg, _Result, _Result (__fastcall *)(_Arg)>(_Left));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Arg1,
+ class _Arg2,
+ class _Result> inline
+ pointer_to_binary_function<_Arg1, _Arg2, _Result, _Result(__cdecl *)(_Arg1, _Arg2)>
+ ptr_fun(_Result (__cdecl *_Left)(_Arg1, _Arg2))
+ {
+ return (std::pointer_to_binary_function<_Arg1, _Arg2, _Result, _Result (__cdecl *)(_Arg1, _Arg2)>(_Left));
+ }
+
+
+template<class _Arg1,
+ class _Arg2,
+ class _Result> inline
+ pointer_to_binary_function<_Arg1, _Arg2, _Result,
+ _Result(__stdcall *)(_Arg1, _Arg2)>
+ ptr_fun(_Result (__stdcall *_Left)(_Arg1, _Arg2))
+ {
+ return (std::pointer_to_binary_function<_Arg1, _Arg2, _Result,
+ _Result (__stdcall *)(_Arg1, _Arg2)>(_Left));
+ }
+
+
+
+template<class _Arg1,
+ class _Arg2,
+ class _Result> inline
+ pointer_to_binary_function<_Arg1, _Arg2, _Result,
+ _Result(__fastcall *)(_Arg1, _Arg2)>
+ ptr_fun(_Result (__fastcall *_Left)(_Arg1, _Arg2))
+ {
+ return (std::pointer_to_binary_function<_Arg1, _Arg2, _Result,
+ _Result (__fastcall *)(_Arg1, _Arg2)>(_Left));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Result,
+ class _Ty>
+ class mem_fun_t
+ : public unary_function<_Ty *, _Result>
+ {
+public:
+ explicit mem_fun_t(_Result (_Ty::*_Pm)())
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(_Ty *_Pleft) const
+ {
+ return ((_Pleft->*_Pmemfun)());
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)();
+ };
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg>
+ class mem_fun1_t
+ : public binary_function<_Ty *, _Arg, _Result>
+ {
+public:
+ explicit mem_fun1_t(_Result (_Ty::*_Pm)(_Arg))
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(_Ty *_Pleft, _Arg _Right) const
+ {
+ return ((_Pleft->*_Pmemfun)(_Right));
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)(_Arg);
+ };
+
+
+template<class _Result,
+ class _Ty>
+ class const_mem_fun_t
+ : public unary_function<const _Ty *, _Result>
+ {
+public:
+ explicit const_mem_fun_t(_Result (_Ty::*_Pm)() const)
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(const _Ty *_Pleft) const
+ {
+ return ((_Pleft->*_Pmemfun)());
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)() const;
+ };
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg>
+ class const_mem_fun1_t
+ : public binary_function<const _Ty *, _Arg, _Result>
+ {
+public:
+ explicit const_mem_fun1_t(_Result (_Ty::*_Pm)(_Arg) const)
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(const _Ty *_Pleft, _Arg _Right) const
+ {
+ return ((_Pleft->*_Pmemfun)(_Right));
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)(_Arg) const;
+ };
+
+
+template<class _Result,
+ class _Ty> inline
+ mem_fun_t<_Result, _Ty> mem_fun(_Result (_Ty::*_Pm)())
+ {
+ return (std::mem_fun_t<_Result, _Ty>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ mem_fun1_t<_Result, _Ty, _Arg> mem_fun(_Result (_Ty::*_Pm)(_Arg))
+ {
+ return (std::mem_fun1_t<_Result, _Ty, _Arg>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty> inline
+ const_mem_fun_t<_Result, _Ty>
+ mem_fun(_Result (_Ty::*_Pm)() const)
+ {
+ return (std::const_mem_fun_t<_Result, _Ty>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ const_mem_fun1_t<_Result, _Ty, _Arg>
+ mem_fun(_Result (_Ty::*_Pm)(_Arg) const)
+ {
+ return (std::const_mem_fun1_t<_Result, _Ty, _Arg>(_Pm));
+ }
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ mem_fun1_t<_Result, _Ty, _Arg> mem_fun1(_Result (_Ty::*_Pm)(_Arg))
+ {
+ return (std::mem_fun1_t<_Result, _Ty, _Arg>(_Pm));
+ }
+
+
+template<class _Result,
+ class _Ty>
+ class mem_fun_ref_t
+ : public unary_function<_Ty, _Result>
+ {
+public:
+ explicit mem_fun_ref_t(_Result (_Ty::*_Pm)())
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(_Ty& _Left) const
+ {
+ return ((_Left.*_Pmemfun)());
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)();
+ };
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg>
+ class mem_fun1_ref_t
+ : public binary_function<_Ty, _Arg, _Result>
+ {
+public:
+ explicit mem_fun1_ref_t(_Result (_Ty::*_Pm)(_Arg))
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(_Ty& _Left, _Arg _Right) const
+ {
+ return ((_Left.*_Pmemfun)(_Right));
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)(_Arg);
+ };
+
+
+template<class _Result,
+ class _Ty>
+ class const_mem_fun_ref_t
+ : public unary_function<_Ty, _Result>
+ {
+public:
+ explicit const_mem_fun_ref_t(_Result (_Ty::*_Pm)() const)
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(const _Ty& _Left) const
+ {
+ return ((_Left.*_Pmemfun)());
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)() const;
+ };
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg>
+ class const_mem_fun1_ref_t
+ : public binary_function<_Ty, _Arg, _Result>
+ {
+public:
+ explicit const_mem_fun1_ref_t(_Result (_Ty::*_Pm)(_Arg) const)
+ : _Pmemfun(_Pm)
+ {
+ }
+
+ _Result operator()(const _Ty& _Left, _Arg _Right) const
+ {
+ return ((_Left.*_Pmemfun)(_Right));
+ }
+
+private:
+ _Result (_Ty::*_Pmemfun)(_Arg) const;
+ };
+
+
+template<class _Result,
+ class _Ty> inline
+ mem_fun_ref_t<_Result, _Ty> mem_fun_ref(_Result (_Ty::*_Pm)())
+ {
+ return (std::mem_fun_ref_t<_Result, _Ty>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ mem_fun1_ref_t<_Result, _Ty, _Arg>
+ mem_fun_ref(_Result (_Ty::*_Pm)(_Arg))
+ {
+ return (std::mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty> inline
+ const_mem_fun_ref_t<_Result, _Ty>
+ mem_fun_ref(_Result (_Ty::*_Pm)() const)
+ {
+ return (std::const_mem_fun_ref_t<_Result, _Ty>(_Pm));
+ }
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ const_mem_fun1_ref_t<_Result, _Ty, _Arg>
+ mem_fun_ref(_Result (_Ty::*_Pm)(_Arg) const)
+ {
+ return (std::const_mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm));
+ }
+
+
+template<class _Result,
+ class _Ty,
+ class _Arg> inline
+ mem_fun1_ref_t<_Result, _Ty, _Arg> mem_fun1_ref(_Result (_Ty::*_Pm)(_Arg))
+ {
+ return (std::mem_fun1_ref_t<_Result, _Ty, _Arg>(_Pm));
+ }
+}
+
+
+ #pragma warning(default: 4244)
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( disable : 4503 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct _iobuf {
+ char *_ptr;
+ int _cnt;
+ char *_base;
+ int _flag;
+ int _file;
+ int _charbuf;
+ int _bufsiz;
+ char *_tmpfname;
+ };
+typedef struct _iobuf FILE;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FILE * __cdecl __iob_func(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef __int64 fpos_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl _filbuf( FILE * _File );
+ int __cdecl _flsbuf( int _Ch, FILE * _File);
+
+
+
+
+ FILE * __cdecl _fsopen( const char * _Filename, const char * _Mode, int _ShFlag);
+
+
+ void __cdecl clearerr( FILE * _File);
+ errno_t __cdecl clearerr_s( FILE * _File );
+ int __cdecl fclose( FILE * _File);
+ int __cdecl _fcloseall(void);
+
+
+
+
+ FILE * __cdecl _fdopen( int _FileHandle, const char * _Mode);
+
+
+ int __cdecl feof( FILE * _File);
+ int __cdecl ferror( FILE * _File);
+ int __cdecl fflush( FILE * _File);
+ int __cdecl fgetc( FILE * _File);
+ int __cdecl _fgetchar(void);
+ int __cdecl fgetpos( FILE * _File , fpos_t * _Pos);
+ char * __cdecl fgets( char * _Buf, int _MaxCount, FILE * _File);
+
+
+
+
+ int __cdecl _fileno( FILE * _File);
+
+
+
+
+
+
+
+ char * __cdecl _tempnam( const char * _DirName, const char * _FilePrefix);
+
+
+
+
+
+ int __cdecl _flushall(void);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "fopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) FILE * __cdecl fopen( const char * _Filename, const char * _Mode);
+
+ errno_t __cdecl fopen_s( FILE ** _File, const char * _Filename, const char * _Mode);
+
+ int __cdecl fprintf( FILE * _File, const char * _Format, ...);
+ int __cdecl fprintf_s( FILE * _File, const char * _Format, ...);
+ int __cdecl fputc( int _Ch, FILE * _File);
+ int __cdecl _fputchar( int _Ch);
+ int __cdecl fputs( const char * _Str, FILE * _File);
+ size_t __cdecl fread( void * _DstBuf, size_t _ElementSize, size_t _Count, FILE * _File);
+ size_t __cdecl fread_s( void * _DstBuf, size_t _DstSize, size_t _ElementSize, size_t _Count, FILE * _File);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "freopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) FILE * __cdecl freopen( const char * _Filename, const char * _Mode, FILE * _File);
+
+ errno_t __cdecl freopen_s( FILE ** _File, const char * _Filename, const char * _Mode, FILE * _OldFile);
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "fscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl fscanf( FILE * _File, const char * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _fscanf_l( FILE * _File, const char * _Format, _locale_t _Locale, ...);
+
+ int __cdecl fscanf_s( FILE * _File, const char * _Format, ...);
+
+ int __cdecl _fscanf_s_l( FILE * _File, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl fsetpos( FILE * _File, const fpos_t * _Pos);
+ int __cdecl fseek( FILE * _File, long _Offset, int _Origin);
+ long __cdecl ftell( FILE * _File);
+
+ int __cdecl _fseeki64( FILE * _File, __int64 _Offset, int _Origin);
+ __int64 __cdecl _ftelli64( FILE * _File);
+
+ size_t __cdecl fwrite( const void * _Str, size_t _Size, size_t _Count, FILE * _File);
+ int __cdecl getc( FILE * _File);
+ int __cdecl getchar(void);
+ int __cdecl _getmaxstdio(void);
+
+ char * __cdecl gets_s( char * _Buf, rsize_t _Size);
+
+extern "C++" { template <size_t _Size> inline char * __cdecl gets_s( char (&_Buffer)[_Size]) { return gets_s(_Buffer, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "gets_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl gets( char *_Buffer);
+ int __cdecl _getw( FILE * _File);
+
+
+ void __cdecl perror( const char * _ErrMsg);
+
+ int __cdecl _pclose( FILE * _File);
+ FILE * __cdecl _popen( const char * _Command, const char * _Mode);
+ int __cdecl printf( const char * _Format, ...);
+ int __cdecl printf_s( const char * _Format, ...);
+ int __cdecl putc( int _Ch, FILE * _File);
+ int __cdecl putchar( int _Ch);
+ int __cdecl puts( const char * _Str);
+ int __cdecl _putw( int _Word, FILE * _File);
+
+
+ int __cdecl remove( const char * _Filename);
+ int __cdecl rename( const char * _OldFilename, const char * _NewFilename);
+ int __cdecl _unlink( const char * _Filename);
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_unlink" ". See online help for details.")) int __cdecl unlink( const char * _Filename);
+
+
+ void __cdecl rewind( FILE * _File);
+ int __cdecl _rmtmp(void);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "scanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl scanf( const char * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_scanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _scanf_l( const char * _Format, _locale_t _Locale, ...);
+
+ int __cdecl scanf_s( const char * _Format, ...);
+
+ int __cdecl _scanf_s_l( const char * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "setvbuf" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl setbuf( FILE * _File, char * _Buffer);
+ int __cdecl _setmaxstdio( int _Max);
+ unsigned int __cdecl _set_output_format( unsigned int _Format);
+ unsigned int __cdecl _get_output_format(void);
+ int __cdecl setvbuf( FILE * _File, char * _Buf, int _Mode, size_t _Size);
+ int __cdecl _snprintf_s( char * _DstBuf, size_t _DstSize, size_t _MaxCount, const char * _Format, ...);
+extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snprintf_s( char (&_Dest)[_Size], size_t _Size, const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnprintf_s(_Dest, _Size, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
+ int __cdecl sprintf_s( char * _DstBuf, size_t _DstSize, const char * _Format, ...);
+extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl sprintf_s( char (&_Dest)[_Size], const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vsprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
+ int __cdecl _scprintf( const char * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "sscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl sscanf( const char * _Src, const char * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _sscanf_l( const char * _Src, const char * _Format, _locale_t _Locale, ...);
+
+ int __cdecl sscanf_s( const char * _Src, const char * _Format, ...);
+
+ int __cdecl _sscanf_s_l( const char * _Src, const char * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snscanf( const char * _Src, size_t _MaxCount, const char * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snscanf_l( const char * _Src, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _snscanf_s( const char * _Src, size_t _MaxCount, const char * _Format, ...);
+ int __cdecl _snscanf_s_l( const char * _Src, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpfile_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) FILE * __cdecl tmpfile(void);
+
+ errno_t __cdecl tmpfile_s( FILE ** _File);
+ errno_t __cdecl tmpnam_s( char * _Buf, rsize_t _Size);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl tmpnam_s( char (&_Buf)[_Size]) { return tmpnam_s(_Buf, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl tmpnam( char *_Buffer);
+ int __cdecl ungetc( int _Ch, FILE * _File);
+ int __cdecl vfprintf( FILE * _File, const char * _Format, va_list _ArgList);
+ int __cdecl vfprintf_s( FILE * _File, const char * _Format, va_list _ArgList);
+ int __cdecl vprintf( const char * _Format, va_list _ArgList);
+ int __cdecl vprintf_s( const char * _Format, va_list _ArgList);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl vsnprintf( char * _DstBuf, size_t _MaxCount, const char * _Format, va_list _ArgList);
+ int __cdecl vsnprintf_s( char * _DstBuf, size_t _DstSize, size_t _MaxCount, const char * _Format, va_list _ArgList);
+ int __cdecl _vsnprintf_s( char * _DstBuf, size_t _DstSize, size_t _MaxCount, const char * _Format, va_list _ArgList);
+extern "C++" { template <size_t _Size> inline int __cdecl _vsnprintf_s( char (&_Dest)[_Size], size_t _Size, const char * _Format, va_list _Args) { return _vsnprintf_s(_Dest, _Size, _Size, _Format, _Args); } }
+#pragma warning(push)
+#pragma warning(disable:4793)
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snprintf( char *_Dest, size_t _Count, const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _vsnprintf( char *_Dest, size_t _Count, const char * _Format, va_list _Args);
+#pragma warning(pop)
+ int __cdecl vsprintf_s( char * _DstBuf, size_t _Size, const char * _Format, va_list _ArgList);
+extern "C++" { template <size_t _Size> inline int __cdecl vsprintf_s( char (&_Dest)[_Size], const char * _Format, va_list _Args) { return vsprintf_s(_Dest, _Size, _Format, _Args); } }
+#pragma warning(push)
+#pragma warning(disable:4793)
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "sprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl sprintf( char *_Dest, const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vsprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl vsprintf( char *_Dest, const char * _Format, va_list _Args);
+#pragma warning(pop)
+ int __cdecl _vscprintf( const char * _Format, va_list _ArgList);
+ int __cdecl _snprintf_c( char * _DstBuf, size_t _MaxCount, const char * _Format, ...);
+ int __cdecl _vsnprintf_c( char *_DstBuf, size_t _MaxCount, const char * _Format, va_list _ArgList);
+
+ int __cdecl _fprintf_p( FILE * _File, const char * _Format, ...);
+ int __cdecl _printf_p( const char * _Format, ...);
+ int __cdecl _sprintf_p( char * _Dst, size_t _MaxCount, const char * _Format, ...);
+ int __cdecl _vfprintf_p( FILE * _File, const char * _Format, va_list _ArgList);
+ int __cdecl _vprintf_p( const char * _Format, va_list _ArgList);
+ int __cdecl _vsprintf_p( char * _Dst, size_t _MaxCount, const char * _Format, va_list _ArgList);
+ int __cdecl _scprintf_p( const char * _Format, ...);
+ int __cdecl _vscprintf_p( const char * _Format, va_list _ArgList);
+ int __cdecl _set_printf_count_output( int _Value);
+ int __cdecl _get_printf_count_output();
+
+ int __cdecl _printf_l( const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _printf_p_l( const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _printf_s_l( const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _vprintf_l( const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vprintf_p_l( const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vprintf_s_l( const char * _Format, _locale_t _Locale, va_list _ArgList);
+
+ int __cdecl _fprintf_l( FILE * _File, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _fprintf_p_l( FILE * _File, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _fprintf_s_l( FILE * _File, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _vfprintf_l( FILE * _File, const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vfprintf_p_l( FILE * _File, const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vfprintf_s_l( FILE * _File, const char * _Format, _locale_t _Locale, va_list _ArgList);
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _sprintf_l( char * _DstBuf, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _sprintf_p_l( char * _DstBuf, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _sprintf_s_l( char * _DstBuf, size_t _DstSize, const char * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _vsprintf_l( char * _DstBuf, const char * _Format, _locale_t, va_list _ArgList);
+ int __cdecl _vsprintf_p_l( char * _DstBuf, size_t _MaxCount, const char* _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vsprintf_s_l( char * _DstBuf, size_t _DstSize, const char * _Format, _locale_t _Locale, va_list _ArgList);
+
+ int __cdecl _scprintf_l( const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _scprintf_p_l( const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _vscprintf_l( const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vscprintf_p_l( const char * _Format, _locale_t _Locale, va_list _ArgList);
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snprintf_l( char * _DstBuf, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _snprintf_c_l( char * _DstBuf, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+ int __cdecl _snprintf_s_l( char * _DstBuf, size_t _DstSize, size_t _MaxCount, const char * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _vsnprintf_l( char * _DstBuf, size_t _MaxCount, const char * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vsnprintf_c_l( char * _DstBuf, size_t _MaxCount, const char *, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vsnprintf_s_l( char * _DstBuf, size_t _DstSize, size_t _MaxCount, const char* _Format, _locale_t _Locale, va_list _ArgList);
+
+
+
+
+
+
+
+
+
+
+
+
+ FILE * __cdecl _wfsopen( const wchar_t * _Filename, const wchar_t * _Mode, int _ShFlag);
+
+
+ wint_t __cdecl fgetwc( FILE * _File);
+ wint_t __cdecl _fgetwchar(void);
+ wint_t __cdecl fputwc( wchar_t _Ch, FILE * _File);
+ wint_t __cdecl _fputwchar( wchar_t _Ch);
+ wint_t __cdecl getwc( FILE * _File);
+ wint_t __cdecl getwchar(void);
+ wint_t __cdecl putwc( wchar_t _Ch, FILE * _File);
+ wint_t __cdecl putwchar( wchar_t _Ch);
+ wint_t __cdecl ungetwc( wint_t _Ch, FILE * _File);
+
+ wchar_t * __cdecl fgetws( wchar_t * _Dst, int _SizeInWords, FILE * _File);
+ int __cdecl fputws( const wchar_t * _Str, FILE * _File);
+ wchar_t * __cdecl _getws_s( wchar_t * _Str, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline wchar_t * __cdecl _getws_s( wchar_t (&_String)[_Size]) { return _getws_s(_String, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_getws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _getws( wchar_t *_String);
+ int __cdecl _putws( const wchar_t * _Str);
+
+ int __cdecl fwprintf( FILE * _File, const wchar_t * _Format, ...);
+ int __cdecl fwprintf_s( FILE * _File, const wchar_t * _Format, ...);
+ int __cdecl wprintf( const wchar_t * _Format, ...);
+ int __cdecl wprintf_s( const wchar_t * _Format, ...);
+ int __cdecl _scwprintf( const wchar_t * _Format, ...);
+ int __cdecl vfwprintf( FILE * _File, const wchar_t * _Format, va_list _ArgList);
+ int __cdecl vfwprintf_s( FILE * _File, const wchar_t * _Format, va_list _ArgList);
+ int __cdecl vwprintf( const wchar_t * _Format, va_list _ArgList);
+ int __cdecl vwprintf_s( const wchar_t * _Format, va_list _ArgList);
+
+ int __cdecl swprintf_s( wchar_t * _Dst, size_t _SizeInWords, const wchar_t * _Format, ...);
+extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl swprintf_s( wchar_t (&_Dest)[_Size], const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vswprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
+ int __cdecl vswprintf_s( wchar_t * _Dst, size_t _SizeInWords, const wchar_t * _Format, va_list _ArgList);
+extern "C++" { template <size_t _Size> inline int __cdecl vswprintf_s( wchar_t (&_Dest)[_Size], const wchar_t * _Format, va_list _Args) { return vswprintf_s(_Dest, _Size, _Format, _Args); } }
+
+ int __cdecl _swprintf_c( wchar_t * _DstBuf, size_t _SizeInWords, const wchar_t * _Format, ...);
+ int __cdecl _vswprintf_c( wchar_t * _DstBuf, size_t _SizeInWords, const wchar_t * _Format, va_list _ArgList);
+
+ int __cdecl _snwprintf_s( wchar_t * _DstBuf, size_t _DstSizeInWords, size_t _MaxCount, const wchar_t * _Format, ...);
+extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snwprintf_s( wchar_t (&_Dest)[_Size], size_t _Count, const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _ArgList); } __pragma(warning(pop)); }
+ int __cdecl _vsnwprintf_s( wchar_t * _DstBuf, size_t _DstSizeInWords, size_t _MaxCount, const wchar_t * _Format, va_list _ArgList);
+extern "C++" { template <size_t _Size> inline int __cdecl _vsnwprintf_s( wchar_t (&_Dest)[_Size], size_t _Count, const wchar_t * _Format, va_list _Args) { return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _Args); } }
+#pragma warning(push)
+#pragma warning(disable:4793)
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snwprintf( wchar_t *_Dest, size_t _Count, const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _vsnwprintf( wchar_t *_Dest, size_t _Count, const wchar_t * _Format, va_list _Args);
+#pragma warning(pop)
+
+ int __cdecl _fwprintf_p( FILE * _File, const wchar_t * _Format, ...);
+ int __cdecl _wprintf_p( const wchar_t * _Format, ...);
+ int __cdecl _vfwprintf_p( FILE * _File, const wchar_t * _Format, va_list _ArgList);
+ int __cdecl _vwprintf_p( const wchar_t * _Format, va_list _ArgList);
+ int __cdecl _swprintf_p( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, ...);
+ int __cdecl _vswprintf_p( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, va_list _ArgList);
+ int __cdecl _scwprintf_p( const wchar_t * _Format, ...);
+ int __cdecl _vscwprintf_p( const wchar_t * _Format, va_list _ArgList);
+
+ int __cdecl _wprintf_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _wprintf_p_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _wprintf_s_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vwprintf_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vwprintf_p_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vwprintf_s_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+ int __cdecl _fwprintf_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _fwprintf_p_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _fwprintf_s_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vfwprintf_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vfwprintf_p_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vfwprintf_s_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+ int __cdecl _swprintf_c_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _swprintf_p_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _swprintf_s_l( wchar_t * _DstBuf, size_t _DstSize, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vswprintf_c_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vswprintf_p_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vswprintf_s_l( wchar_t * _DstBuf, size_t _DstSize, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+ int __cdecl _scwprintf_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _scwprintf_p_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vscwprintf_p_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snwprintf_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _snwprintf_s_l( wchar_t * _DstBuf, size_t _DstSize, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _vsnwprintf_l( wchar_t * _DstBuf, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vsnwprintf_s_l( wchar_t * _DstBuf, size_t _DstSize, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4141 4996 4793)
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) int __cdecl _swprintf( wchar_t *_Dest, const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) int __cdecl _vswprintf( wchar_t *_Dest, const wchar_t * _Format, va_list _Args);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "__swprintf_l_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) int __cdecl __swprintf_l( wchar_t *_Dest, const wchar_t * _Format, _locale_t _Plocinfo, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) int __cdecl __vswprintf_l( wchar_t *_Dest, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Args);

+#pragma warning(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4793 4412 )
+static __inline int swprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, ...)
+{
+ va_list _Arglist;
+ int _Ret;
+ ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
+ _Ret = _vswprintf_c_l(_String, _Count, _Format, 0, _Arglist);
+ ( _Arglist = (va_list)0 );
+ return _Ret;
+}
+#pragma warning( pop )
+
+#pragma warning( push )
+#pragma warning( disable : 4412 )
+static __inline int __cdecl vswprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, va_list _Ap)
+{
+ return _vswprintf_c_l(_String, _Count, _Format, 0, _Ap);
+}
+#pragma warning( pop )
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4793 4412 )
+static __inline int _swprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, ...)
+{
+ va_list _Arglist;
+ int _Ret;
+ ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
+ _Ret = _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Arglist);
+ ( _Arglist = (va_list)0 );
+ return _Ret;
+}
+#pragma warning( pop )
+
+#pragma warning( push )
+#pragma warning( disable : 4412 )
+static __inline int __cdecl _vswprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
+{
+ return _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Ap);
+}
+#pragma warning( pop )
+
+
+#pragma warning( push )
+#pragma warning( disable : 4996 )
+
+#pragma warning( push )
+#pragma warning( disable : 4793 4141 )
+extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int swprintf( wchar_t * _String, const wchar_t * _Format, ...)
+{
+ va_list _Arglist;
+ ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
+ int _Ret = _vswprintf(_String, _Format, _Arglist);
+ ( _Arglist = (va_list)0 );
+ return _Ret;
+}
+#pragma warning( pop )
+
+#pragma warning( push )
+#pragma warning( disable : 4141 )
+extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl vswprintf( wchar_t * _String, const wchar_t * _Format, va_list _Ap)
+{
+ return _vswprintf(_String, _Format, _Ap);
+}
+#pragma warning( pop )
+
+#pragma warning( push )
+#pragma warning( disable : 4793 4141 )
+extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int _swprintf_l( wchar_t * _String, const wchar_t * _Format, _locale_t _Plocinfo, ...)
+{
+ va_list _Arglist;
+ ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
+ int _Ret = __vswprintf_l(_String, _Format, _Plocinfo, _Arglist);
+ ( _Arglist = (va_list)0 );
+ return _Ret;
+}
+#pragma warning( pop )
+
+#pragma warning( push )
+#pragma warning( disable : 4141 )
+extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl _vswprintf_l( wchar_t * _String, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
+{
+ return __vswprintf_l(_String, _Format, _Plocinfo, _Ap);
+}
+#pragma warning( pop )
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wchar_t * __cdecl _wtempnam( const wchar_t * _Directory, const wchar_t * _FilePrefix);
+
+
+
+
+
+ int __cdecl _vscwprintf( const wchar_t * _Format, va_list _ArgList);
+ int __cdecl _vscwprintf_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "fwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl fwscanf( FILE * _File, const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _fwscanf_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, ...);
+
+ int __cdecl fwscanf_s( FILE * _File, const wchar_t * _Format, ...);
+
+ int __cdecl _fwscanf_s_l( FILE * _File, const wchar_t * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "swscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl swscanf( const wchar_t * _Src, const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _swscanf_l( const wchar_t * _Src, const wchar_t * _Format, _locale_t _Locale, ...);
+
+ int __cdecl swscanf_s( const wchar_t *_Src, const wchar_t * _Format, ...);
+
+ int __cdecl _swscanf_s_l( const wchar_t * _Src, const wchar_t * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snwscanf( const wchar_t * _Src, size_t _MaxCount, const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _snwscanf_l( const wchar_t * _Src, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _snwscanf_s( const wchar_t * _Src, size_t _MaxCount, const wchar_t * _Format, ...);
+ int __cdecl _snwscanf_s_l( const wchar_t * _Src, size_t _MaxCount, const wchar_t * _Format, _locale_t _Locale, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl wscanf( const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _wscanf_l( const wchar_t * _Format, _locale_t _Locale, ...);
+
+ int __cdecl wscanf_s( const wchar_t * _Format, ...);
+
+ int __cdecl _wscanf_s_l( const wchar_t * _Format, _locale_t _Locale, ...);
+
+ FILE * __cdecl _wfdopen( int _FileHandle , const wchar_t * _Mode);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) FILE * __cdecl _wfopen( const wchar_t * _Filename, const wchar_t * _Mode);
+ errno_t __cdecl _wfopen_s( FILE ** _File, const wchar_t * _Filename, const wchar_t * _Mode);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfreopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) FILE * __cdecl _wfreopen( const wchar_t * _Filename, const wchar_t * _Mode, FILE * _OldFile);
+ errno_t __cdecl _wfreopen_s( FILE ** _File, const wchar_t * _Filename, const wchar_t * _Mode, FILE * _OldFile);
+
+
+
+ void __cdecl _wperror( const wchar_t * _ErrMsg);
+
+ FILE * __cdecl _wpopen( const wchar_t *_Command, const wchar_t * _Mode);
+ int __cdecl _wremove( const wchar_t * _Filename);
+ errno_t __cdecl _wtmpnam_s( wchar_t * _DstBuf, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wtmpnam_s( wchar_t (&_Buffer)[_Size]) { return _wtmpnam_s(_Buffer, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wtmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wtmpnam( wchar_t *_Buffer);
+
+ wint_t __cdecl _fgetwc_nolock( FILE * _File);
+ wint_t __cdecl _fputwc_nolock( wchar_t _Ch, FILE * _File);
+ wint_t __cdecl _ungetwc_nolock( wint_t _Ch, FILE * _File);
+
+
+
+
+
+
+
+inline wint_t __cdecl getwchar()
+ {return (fgetwc((&__iob_func()[0]))); }
+inline wint_t __cdecl putwchar(wchar_t _C)
+ {return (fputwc(_C, (&__iob_func()[1]))); }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ void __cdecl _lock_file( FILE * _File);
+ void __cdecl _unlock_file( FILE * _File);
+
+
+
+
+
+
+ int __cdecl _fclose_nolock( FILE * _File);
+ int __cdecl _fflush_nolock( FILE * _File);
+ size_t __cdecl _fread_nolock( void * _DstBuf, size_t _ElementSize, size_t _Count, FILE * _File);
+ size_t __cdecl _fread_nolock_s( void * _DstBuf, size_t _DstSize, size_t _ElementSize, size_t _Count, FILE * _File);
+ int __cdecl _fseek_nolock( FILE * _File, long _Offset, int _Origin);
+ long __cdecl _ftell_nolock( FILE * _File);
+ int __cdecl _fseeki64_nolock( FILE * _File, __int64 _Offset, int _Origin);
+ __int64 __cdecl _ftelli64_nolock( FILE * _File);
+ size_t __cdecl _fwrite_nolock( const void * _DstBuf, size_t _Size, size_t _Count, FILE * _File);
+ int __cdecl _ungetc_nolock( int _Ch, FILE * _File);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_tempnam" ". See online help for details.")) char * __cdecl tempnam( const char * _Directory, const char * _FilePrefix);
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcloseall" ". See online help for details.")) int __cdecl fcloseall(void);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fdopen" ". See online help for details.")) FILE * __cdecl fdopen( int _FileHandle, const char * _Format);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fgetchar" ". See online help for details.")) int __cdecl fgetchar(void);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fileno" ". See online help for details.")) int __cdecl fileno( FILE * _File);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_flushall" ". See online help for details.")) int __cdecl flushall(void);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fputchar" ". See online help for details.")) int __cdecl fputchar( int _Ch);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getw" ". See online help for details.")) int __cdecl getw( FILE * _File);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putw" ". See online help for details.")) int __cdecl putw( int _Ch, FILE * _File);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_rmtmp" ". See online help for details.")) int __cdecl rmtmp(void);
+
+
+
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+using ::size_t; using ::fpos_t; using ::FILE;
+using ::clearerr; using ::fclose; using ::feof;
+using ::ferror; using ::fflush; using ::fgetc;
+using ::fgetpos; using ::fgets; using ::fopen;
+using ::fprintf; using ::fputc; using ::fputs;
+using ::fread; using ::freopen; using ::fscanf;
+using ::fseek; using ::fsetpos; using ::ftell;
+using ::fwrite; using ::getc; using ::getchar;
+using ::gets; using ::perror;
+using ::putc; using ::putchar;
+using ::printf; using ::puts; using ::remove;
+using ::rename; using ::rewind; using ::scanf;
+using ::setbuf; using ::setvbuf; using ::sprintf;
+using ::sscanf; using ::tmpfile; using ::tmpnam;
+using ::ungetc; using ::vfprintf; using ::vprintf;
+using ::vsprintf;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ void * __cdecl _memccpy( void * _Dst, const void * _Src, int _Val, size_t _MaxCount);
+ const void * __cdecl memchr( const void * _Buf , int _Val, size_t _MaxCount);
+ int __cdecl _memicmp( const void * _Buf1, const void * _Buf2, size_t _Size);
+ int __cdecl _memicmp_l( const void * _Buf1, const void * _Buf2, size_t _Size, _locale_t _Locale);
+ int __cdecl memcmp( const void * _Buf1, const void * _Buf2, size_t _Size);
+ void * __cdecl memcpy( void * _Dst, const void * _Src, size_t _Size);
+
+ errno_t __cdecl memcpy_s( void * _Dst, rsize_t _DstSize, const void * _Src, rsize_t _MaxCount);
+
+ void * __cdecl memset( void * _Dst, int _Val, size_t _Size);
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memccpy" ". See online help for details.")) void * __cdecl memccpy( void * _Dst, const void * _Src, int _Val, size_t _Size);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memicmp" ". See online help for details.")) int __cdecl memicmp( const void * _Buf1, const void * _Buf2, size_t _Size);
+
+
+
+
+ errno_t __cdecl _strset_s( char * _Dst, size_t _DstSize, int _Value);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strset_s( char (&_Dest)[_Size], int _Value) { return _strset_s(_Dest, _Size, _Value); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strset( char *_Dest, int _Value);
+
+ errno_t __cdecl strcpy_s( char * _Dst, rsize_t _DstSize, const char * _Src);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl strcpy_s( char (&_Dest)[_Size], const char * _Source) { return strcpy_s(_Dest, _Size, _Source); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strcpy( char *_Dest, const char * _Source);
+
+ errno_t __cdecl strcat_s( char * _Dst, rsize_t _DstSize, const char * _Src);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl strcat_s( char (&_Dest)[_Size], const char * _Source) { return strcat_s(_Dest, _Size, _Source); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strcat( char *_Dest, const char * _Source);
+ int __cdecl strcmp( const char * _Str1, const char * _Str2);
+ size_t __cdecl strlen( const char * _Str);
+ size_t __cdecl strnlen( const char * _Str, size_t _MaxCount);
+
+static __inline size_t __cdecl strnlen_s( const char * _Str, size_t _MaxCount)
+{
+ return strnlen(_Str, _MaxCount);
+}
+
+
+ errno_t __cdecl memmove_s( void * _Dst, rsize_t _DstSize, const void * _Src, rsize_t _MaxCount);
+
+
+
+
+
+ void * __cdecl memmove( void * _Dst, const void * _Src, size_t _Size);
+
+
+
+
+
+
+
+ char * __cdecl _strdup( const char * _Src);
+
+
+
+
+
+ const char * __cdecl strchr( const char * _Str, int _Val);
+ int __cdecl _stricmp( const char * _Str1, const char * _Str2);
+ int __cdecl _strcmpi( const char * _Str1, const char * _Str2);
+ int __cdecl _stricmp_l( const char * _Str1, const char * _Str2, _locale_t _Locale);
+ int __cdecl strcoll( const char * _Str1, const char * _Str2);
+ int __cdecl _strcoll_l( const char * _Str1, const char * _Str2, _locale_t _Locale);
+ int __cdecl _stricoll( const char * _Str1, const char * _Str2);
+ int __cdecl _stricoll_l( const char * _Str1, const char * _Str2, _locale_t _Locale);
+ int __cdecl _strncoll ( const char * _Str1, const char * _Str2, size_t _MaxCount);
+ int __cdecl _strncoll_l( const char * _Str1, const char * _Str2, size_t _MaxCount, _locale_t _Locale);
+ int __cdecl _strnicoll ( const char * _Str1, const char * _Str2, size_t _MaxCount);
+ int __cdecl _strnicoll_l( const char * _Str1, const char * _Str2, size_t _MaxCount, _locale_t _Locale);
+ size_t __cdecl strcspn( const char * _Str, const char * _Control);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strerror( const char * _ErrMsg);
+ errno_t __cdecl _strerror_s( char * _Buf, size_t _SizeInBytes, const char * _ErrMsg);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strerror_s( char (&_Buffer)[_Size], const char * _ErrorMessage) { return _strerror_s(_Buffer, _Size, _ErrorMessage); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strerror( int);
+
+ errno_t __cdecl strerror_s( char * _Buf, size_t _SizeInBytes, int _ErrNum);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl strerror_s( char (&_Buffer)[_Size], int _ErrorMessage) { return strerror_s(_Buffer, _Size, _ErrorMessage); } }
+ errno_t __cdecl _strlwr_s( char * _Str, size_t _Size);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s( char (&_String)[_Size]) { return _strlwr_s(_String, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strlwr( char *_String);
+ errno_t __cdecl _strlwr_s_l( char * _Str, size_t _Size, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s_l( char (&_String)[_Size], _locale_t _Locale) { return _strlwr_s_l(_String, _Size, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strlwr_l( char *_String, _locale_t _Locale);
+
+ errno_t __cdecl strncat_s( char * _Dst, rsize_t _DstSize, const char * _Src, rsize_t _MaxCount);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl strncat_s( char (&_Dest)[_Size], const char * _Source, size_t _Count) { return strncat_s(_Dest, _Size, _Source, _Count); } }
+#pragma warning(push)
+#pragma warning(disable:6059)
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strncat( char *_Dest, const char * _Source, size_t _Count);
+#pragma warning(pop)
+
+
+
+ int __cdecl strncmp( const char * _Str1, const char * _Str2, size_t _MaxCount);
+
+ int __cdecl _strnicmp( const char * _Str1, const char * _Str2, size_t _MaxCount);
+ int __cdecl _strnicmp_l( const char * _Str1, const char * _Str2, size_t _MaxCount, _locale_t _Locale);
+
+ errno_t __cdecl strncpy_s( char * _Dst, rsize_t _DstSize, const char * _Src, rsize_t _MaxCount);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl strncpy_s( char (&_Dest)[_Size], const char * _Source, size_t _Count) { return strncpy_s(_Dest, _Size, _Source, _Count); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strncpy( char *_Dest, const char * _Source, size_t _Count);
+ errno_t __cdecl _strnset_s( char * _Str, size_t _Size, int _Val, size_t _MaxCount);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strnset_s( char (&_Dest)[_Size], int _Val, size_t _Count) { return _strnset_s(_Dest, _Size, _Val, _Count); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strnset( char *_Dest, int _Val, size_t _Count);
+ const char * __cdecl strpbrk( const char * _Str, const char * _Control);
+ const char * __cdecl strrchr( const char * _Str, int _Ch);
+ char * __cdecl _strrev( char * _Str);
+ size_t __cdecl strspn( const char * _Str, const char * _Control);
+ const char * __cdecl strstr( const char * _Str, const char * _SubStr);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "strtok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl strtok( char * _Str, const char * _Delim);
+
+ char * __cdecl strtok_s( char * _Str, const char * _Delim, char ** _Context);
+
+ errno_t __cdecl _strupr_s( char * _Str, size_t _Size);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s( char (&_String)[_Size]) { return _strupr_s(_String, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strupr( char *_String);
+ errno_t __cdecl _strupr_s_l( char * _Str, size_t _Size, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s_l( char (&_String)[_Size], _locale_t _Locale) { return _strupr_s_l(_String, _Size, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _strupr_l( char *_String, _locale_t _Locale);
+ size_t __cdecl strxfrm ( char * _Dst, const char * _Src, size_t _MaxCount);
+ size_t __cdecl _strxfrm_l( char * _Dst, const char * _Src, size_t _MaxCount, _locale_t _Locale);
+
+
+extern "C++" {
+
+
+inline char * __cdecl strchr( char * _Str, int _Ch)
+ { return (char*)strchr((const char*)_Str, _Ch); }
+inline char * __cdecl strpbrk( char * _Str, const char * _Control)
+ { return (char*)strpbrk((const char*)_Str, _Control); }
+inline char * __cdecl strrchr( char * _Str, int _Ch)
+ { return (char*)strrchr((const char*)_Str, _Ch); }
+inline char * __cdecl strstr( char * _Str, const char * _SubStr)
+ { return (char*)strstr((const char*)_Str, _SubStr); }
+
+
+
+inline void * __cdecl memchr( void * _Pv, int _C, size_t _N)
+ { return (void*)memchr((const void*)_Pv, _C, _N); }
+
+}
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strdup" ". See online help for details.")) char * __cdecl strdup( const char * _Src);
+
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strcmpi" ". See online help for details.")) int __cdecl strcmpi( const char * _Str1, const char * _Str2);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_stricmp" ". See online help for details.")) int __cdecl stricmp( const char * _Str1, const char * _Str2);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strlwr" ". See online help for details.")) char * __cdecl strlwr( char * _Str);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnicmp" ". See online help for details.")) int __cdecl strnicmp( const char * _Str1, const char * _Str, size_t _MaxCount);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnset" ". See online help for details.")) char * __cdecl strnset( char * _Str, int _Val, size_t _MaxCount);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strrev" ". See online help for details.")) char * __cdecl strrev( char * _Str);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strset" ". See online help for details.")) char * __cdecl strset( char * _Str, int _Val);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strupr" ". See online help for details.")) char * __cdecl strupr( char * _Str);
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wchar_t * __cdecl _wcsdup( const wchar_t * _Str);
+
+
+
+
+
+
+ errno_t __cdecl wcscat_s( wchar_t * _Dst, rsize_t _DstSize, const wchar_t * _Src);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscat_s( wchar_t (&_Dest)[_Size], const wchar_t * _Source) { return wcscat_s(_Dest, _Size, _Source); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl wcscat( wchar_t *_Dest, const wchar_t * _Source);
+ const wchar_t * __cdecl wcschr( const wchar_t * _Str, wchar_t _Ch);
+ int __cdecl wcscmp( const wchar_t * _Str1, const wchar_t * _Str2);
+
+ errno_t __cdecl wcscpy_s( wchar_t * _Dst, rsize_t _DstSize, const wchar_t * _Src);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscpy_s( wchar_t (&_Dest)[_Size], const wchar_t * _Source) { return wcscpy_s(_Dest, _Size, _Source); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl wcscpy( wchar_t *_Dest, const wchar_t * _Source);
+ size_t __cdecl wcscspn( const wchar_t * _Str, const wchar_t * _Control);
+ size_t __cdecl wcslen( const wchar_t * _Str);
+ size_t __cdecl wcsnlen( const wchar_t * _Src, size_t _MaxCount);
+
+static __inline size_t __cdecl wcsnlen_s( const wchar_t * _Src, size_t _MaxCount)
+{
+ return wcsnlen(_Src, _MaxCount);
+}
+
+
+ errno_t __cdecl wcsncat_s( wchar_t * _Dst, rsize_t _DstSize, const wchar_t * _Src, rsize_t _MaxCount);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncat_s( wchar_t (&_Dest)[_Size], const wchar_t * _Source, size_t _Count) { return wcsncat_s(_Dest, _Size, _Source, _Count); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl wcsncat( wchar_t *_Dest, const wchar_t * _Source, size_t _Count);
+ int __cdecl wcsncmp( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount);
+
+ errno_t __cdecl wcsncpy_s( wchar_t * _Dst, rsize_t _DstSize, const wchar_t * _Src, rsize_t _MaxCount);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncpy_s( wchar_t (&_Dest)[_Size], const wchar_t * _Source, size_t _Count) { return wcsncpy_s(_Dest, _Size, _Source, _Count); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl wcsncpy( wchar_t *_Dest, const wchar_t * _Source, size_t _Count);
+ const wchar_t * __cdecl wcspbrk( const wchar_t * _Str, const wchar_t * _Control);
+ const wchar_t * __cdecl wcsrchr( const wchar_t * _Str, wchar_t _Ch);
+ size_t __cdecl wcsspn( const wchar_t * _Str, const wchar_t * _Control);
+ const wchar_t * __cdecl wcsstr( const wchar_t * _Str, const wchar_t * _SubStr);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl wcstok( wchar_t * _Str, const wchar_t * _Delim);
+ wchar_t * __cdecl wcstok_s( wchar_t * _Str, const wchar_t * _Delim, wchar_t ** _Context);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcserror( int _ErrNum);
+ errno_t __cdecl _wcserror_s( wchar_t * _Buf, size_t _SizeInWords, int _ErrNum);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcserror_s( wchar_t (&_Buffer)[_Size], int _Error) { return _wcserror_s(_Buffer, _Size, _Error); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "__wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl __wcserror( const wchar_t * _Str);
+ errno_t __cdecl __wcserror_s( wchar_t * _Buffer, size_t _SizeInWords, const wchar_t * _ErrMsg);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl __wcserror_s( wchar_t (&_Buffer)[_Size], const wchar_t * _ErrorMessage) { return __wcserror_s(_Buffer, _Size, _ErrorMessage); } }
+
+ int __cdecl _wcsicmp( const wchar_t * _Str1, const wchar_t * _Str2);
+ int __cdecl _wcsicmp_l( const wchar_t * _Str1, const wchar_t * _Str2, _locale_t _Locale);
+ int __cdecl _wcsnicmp( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount);
+ int __cdecl _wcsnicmp_l( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount, _locale_t _Locale);
+ errno_t __cdecl _wcsnset_s( wchar_t * _Dst, size_t _DstSizeInWords, wchar_t _Val, size_t _MaxCount);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s( wchar_t (&_Dst)[_Size], wchar_t _Val, size_t _MaxCount) { return _wcsnset_s(_Dst, _Size, _Val, _MaxCount); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcsnset( wchar_t *_Str, wchar_t _Val, size_t _MaxCount);
+ wchar_t * __cdecl _wcsrev( wchar_t * _Str);
+ errno_t __cdecl _wcsset_s( wchar_t * _Str, size_t _SizeInWords, wchar_t _Val);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s( wchar_t (&_Str)[_Size], wchar_t _Val) { return _wcsset_s(_Str, _Size, _Val); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcsset( wchar_t *_Str, wchar_t _Val);
+
+ errno_t __cdecl _wcslwr_s( wchar_t * _Str, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s( wchar_t (&_String)[_Size]) { return _wcslwr_s(_String, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcslwr( wchar_t *_String);
+ errno_t __cdecl _wcslwr_s_l( wchar_t * _Str, size_t _SizeInWords, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s_l( wchar_t (&_String)[_Size], _locale_t _Locale) { return _wcslwr_s_l(_String, _Size, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcslwr_l( wchar_t *_String, _locale_t _Locale);
+ errno_t __cdecl _wcsupr_s( wchar_t * _Str, size_t _Size);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s( wchar_t (&_String)[_Size]) { return _wcsupr_s(_String, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcsupr( wchar_t *_String);
+ errno_t __cdecl _wcsupr_s_l( wchar_t * _Str, size_t _Size, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s_l( wchar_t (&_String)[_Size], _locale_t _Locale) { return _wcsupr_s_l(_String, _Size, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wcsupr_l( wchar_t *_String, _locale_t _Locale);
+ size_t __cdecl wcsxfrm( wchar_t * _Dst, const wchar_t * _Src, size_t _MaxCount);
+ size_t __cdecl _wcsxfrm_l( wchar_t * _Dst, const wchar_t *_Src, size_t _MaxCount, _locale_t _Locale);
+ int __cdecl wcscoll( const wchar_t * _Str1, const wchar_t * _Str2);
+ int __cdecl _wcscoll_l( const wchar_t * _Str1, const wchar_t * _Str2, _locale_t _Locale);
+ int __cdecl _wcsicoll( const wchar_t * _Str1, const wchar_t * _Str2);
+ int __cdecl _wcsicoll_l( const wchar_t * _Str1, const wchar_t *_Str2, _locale_t _Locale);
+ int __cdecl _wcsncoll( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount);
+ int __cdecl _wcsncoll_l( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount, _locale_t _Locale);
+ int __cdecl _wcsnicoll( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount);
+ int __cdecl _wcsnicoll_l( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount, _locale_t _Locale);
+
+
+
+
+extern "C++" {
+inline wchar_t * __cdecl wcschr( wchar_t *_Str, wchar_t _Ch)
+ {return ((wchar_t *)wcschr((const wchar_t *)_Str, _Ch)); }
+inline wchar_t * __cdecl wcspbrk( wchar_t *_Str, const wchar_t *_Control)
+ {return ((wchar_t *)wcspbrk((const wchar_t *)_Str, _Control)); }
+inline wchar_t * __cdecl wcsrchr( wchar_t *_Str, wchar_t _Ch)
+ {return ((wchar_t *)wcsrchr((const wchar_t *)_Str, _Ch)); }
+inline wchar_t * __cdecl wcsstr( wchar_t *_Str, const wchar_t *_SubStr)
+ {return ((wchar_t *)wcsstr((const wchar_t *)_Str, _SubStr)); }
+}
+
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsdup" ". See online help for details.")) wchar_t * __cdecl wcsdup( const wchar_t * _Str);
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicmp" ". See online help for details.")) int __cdecl wcsicmp( const wchar_t * _Str1, const wchar_t * _Str2);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnicmp" ". See online help for details.")) int __cdecl wcsnicmp( const wchar_t * _Str1, const wchar_t * _Str2, size_t _MaxCount);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnset" ". See online help for details.")) wchar_t * __cdecl wcsnset( wchar_t * _Str, wchar_t _Val, size_t _MaxCount);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsrev" ". See online help for details.")) wchar_t * __cdecl wcsrev( wchar_t * _Str);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsset" ". See online help for details.")) wchar_t * __cdecl wcsset( wchar_t * _Str, wchar_t _Val);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcslwr" ". See online help for details.")) wchar_t * __cdecl wcslwr( wchar_t * _Str);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsupr" ". See online help for details.")) wchar_t * __cdecl wcsupr( wchar_t * _Str);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicoll" ". See online help for details.")) int __cdecl wcsicoll( const wchar_t * _Str1, const wchar_t * _Str2);
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+namespace std {
+using ::size_t; using ::memchr; using ::memcmp;
+using ::memcpy; using ::memmove; using ::memset;
+using ::strcat; using ::strchr; using ::strcmp;
+using ::strcoll; using ::strcpy; using ::strcspn;
+using ::strerror; using ::strlen; using ::strncat;
+using ::strncmp; using ::strncpy; using ::strpbrk;
+using ::strrchr; using ::strspn; using ::strstr;
+using ::strtok; using ::strxfrm;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef unsigned long _fsize_t;
+
+
+
+
+
+struct _wfinddata32_t {
+ unsigned attrib;
+ __time32_t time_create;
+ __time32_t time_access;
+ __time32_t time_write;
+ _fsize_t size;
+ wchar_t name[260];
+};
+
+
+
+struct _wfinddata32i64_t {
+ unsigned attrib;
+ __time32_t time_create;
+ __time32_t time_access;
+ __time32_t time_write;
+ __int64 size;
+ wchar_t name[260];
+};
+
+struct _wfinddata64i32_t {
+ unsigned attrib;
+ __time64_t time_create;
+ __time64_t time_access;
+ __time64_t time_write;
+ _fsize_t size;
+ wchar_t name[260];
+};
+
+struct _wfinddata64_t {
+ unsigned attrib;
+ __time64_t time_create;
+ __time64_t time_access;
+ __time64_t time_write;
+ __int64 size;
+ wchar_t name[260];
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ const unsigned short * __cdecl __pctype_func(void);
+
+ extern const unsigned short *_pctype;
+
+
+
+
+
+
+
+
+
+
+ extern const unsigned short _wctype[];
+
+
+ const wctype_t * __cdecl __pwctype_func(void);
+
+ extern const wctype_t *_pwctype;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl iswalpha( wint_t _C);
+ int __cdecl _iswalpha_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswupper( wint_t _C);
+ int __cdecl _iswupper_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswlower( wint_t _C);
+ int __cdecl _iswlower_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswdigit( wint_t _C);
+ int __cdecl _iswdigit_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswxdigit( wint_t _C);
+ int __cdecl _iswxdigit_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswspace( wint_t _C);
+ int __cdecl _iswspace_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswpunct( wint_t _C);
+ int __cdecl _iswpunct_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswalnum( wint_t _C);
+ int __cdecl _iswalnum_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswprint( wint_t _C);
+ int __cdecl _iswprint_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswgraph( wint_t _C);
+ int __cdecl _iswgraph_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswcntrl( wint_t _C);
+ int __cdecl _iswcntrl_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswascii( wint_t _C);
+ int __cdecl isleadbyte( int _C);
+ int __cdecl _isleadbyte_l( int _C, _locale_t _Locale);
+
+ wint_t __cdecl towupper( wint_t _C);
+ wint_t __cdecl _towupper_l( wint_t _C, _locale_t _Locale);
+ wint_t __cdecl towlower( wint_t _C);
+ wint_t __cdecl _towlower_l( wint_t _C, _locale_t _Locale);
+ int __cdecl iswctype( wint_t _C, wctype_t _Type);
+ int __cdecl _iswctype_l( wint_t _C, wctype_t _Type, _locale_t _Locale);
+
+ int __cdecl __iswcsymf( wint_t _C);
+ int __cdecl _iswcsymf_l( wint_t _C, _locale_t _Locale);
+ int __cdecl __iswcsym( wint_t _C);
+ int __cdecl _iswcsym_l( wint_t _C, _locale_t _Locale);
+
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "iswctype" " instead. See online help for details.")) int __cdecl is_wctype( wint_t _C, wctype_t _Type);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wchar_t * __cdecl _wgetcwd( wchar_t * _DstBuf, int _SizeInWords);
+ wchar_t * __cdecl _wgetdcwd( int _Drive, wchar_t * _DstBuf, int _SizeInWords);
+ wchar_t * __cdecl _wgetdcwd_nolock( int _Drive, wchar_t * _DstBuf, int _SizeInWords);
+
+
+
+
+
+
+
+ int __cdecl _wchdir( const wchar_t * _Path);
+ int __cdecl _wmkdir( const wchar_t * _Path);
+ int __cdecl _wrmdir( const wchar_t * _Path);
+
+
+
+
+
+
+ int __cdecl _waccess( const wchar_t * _Filename, int _AccessMode);
+ errno_t __cdecl _waccess_s( const wchar_t * _Filename, int _AccessMode);
+ int __cdecl _wchmod( const wchar_t * _Filename, int _Mode);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _wcreat( const wchar_t * _Filename, int _PermissionMode);
+ intptr_t __cdecl _wfindfirst32( const wchar_t * _Filename, struct _wfinddata32_t * _FindData);
+ int __cdecl _wfindnext32( intptr_t _FindHandle, struct _wfinddata32_t * _FindData);
+ int __cdecl _wunlink( const wchar_t * _Filename);
+ int __cdecl _wrename( const wchar_t * _NewFilename, const wchar_t * _OldFilename);
+ errno_t __cdecl _wmktemp_s( wchar_t * _TemplateName, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmktemp_s( wchar_t (&_TemplateName)[_Size]) { return _wmktemp_s(_TemplateName, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmktemp_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wmktemp( wchar_t *_TemplateName);
+
+
+ intptr_t __cdecl _wfindfirst32i64( const wchar_t * _Filename, struct _wfinddata32i64_t * _FindData);
+ intptr_t __cdecl _wfindfirst64i32( const wchar_t * _Filename, struct _wfinddata64i32_t * _FindData);
+ intptr_t __cdecl _wfindfirst64( const wchar_t * _Filename, struct _wfinddata64_t * _FindData);
+ int __cdecl _wfindnext32i64( intptr_t _FindHandle, struct _wfinddata32i64_t * _FindData);
+ int __cdecl _wfindnext64i32( intptr_t _FindHandle, struct _wfinddata64i32_t * _FindData);
+ int __cdecl _wfindnext64( intptr_t _FindHandle, struct _wfinddata64_t * _FindData);
+
+
+ errno_t __cdecl _wsopen_s( int * _FileHandle, const wchar_t * _Filename, int _OpenFlag, int _ShareFlag, int _PermissionFlag);
+
+
+
+
+
+
+
+
+
+extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _wopen( const wchar_t * _Filename, int _OpenFlag, int _PermissionMode = 0);
+extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _wsopen( const wchar_t * _Filename, int _OpenFlag, int _ShareFlag, int _PermissionMode = 0);
+
+
+
+
+
+
+
+
+
+
+ wchar_t * __cdecl _wsetlocale( int _Category, const wchar_t * _Locale);
+
+
+
+
+
+
+
+
+ intptr_t __cdecl _wexecl( const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wexecle( const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wexeclp( const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wexeclpe( const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wexecv( const wchar_t * _Filename, const wchar_t * const * _ArgList);
+ intptr_t __cdecl _wexecve( const wchar_t * _Filename, const wchar_t * const * _ArgList,
+ const wchar_t * const * _Env);
+ intptr_t __cdecl _wexecvp( const wchar_t * _Filename, const wchar_t * const * _ArgList);
+ intptr_t __cdecl _wexecvpe( const wchar_t * _Filename, const wchar_t * const * _ArgList,
+ const wchar_t * const * _Env);
+ intptr_t __cdecl _wspawnl( int _Mode, const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wspawnle( int _Mode, const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wspawnlp( int _Mode, const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wspawnlpe( int _Mode, const wchar_t * _Filename, const wchar_t * _ArgList, ...);
+ intptr_t __cdecl _wspawnv( int _Mode, const wchar_t * _Filename, const wchar_t * const * _ArgList);
+ intptr_t __cdecl _wspawnve( int _Mode, const wchar_t * _Filename, const wchar_t * const * _ArgList,
+ const wchar_t * const * _Env);
+ intptr_t __cdecl _wspawnvp( int _Mode, const wchar_t * _Filename, const wchar_t * const * _ArgList);
+ intptr_t __cdecl _wspawnvpe( int _Mode, const wchar_t * _Filename, const wchar_t * const * _ArgList,
+ const wchar_t * const * _Env);
+
+
+ int __cdecl _wsystem( const wchar_t * _Command);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef unsigned short _ino_t;
+
+
+typedef unsigned short ino_t;
+
+
+
+
+
+typedef unsigned int _dev_t;
+
+
+typedef unsigned int dev_t;
+
+
+
+
+
+typedef long _off_t;
+
+
+typedef long off_t;
+
+
+
+
+
+
+struct _stat32 {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ _off_t st_size;
+ __time32_t st_atime;
+ __time32_t st_mtime;
+ __time32_t st_ctime;
+ };
+
+
+
+struct stat {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ _off_t st_size;
+ time_t st_atime;
+ time_t st_mtime;
+ time_t st_ctime;
+ };
+
+
+
+
+
+struct _stat32i64 {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ __int64 st_size;
+ __time32_t st_atime;
+ __time32_t st_mtime;
+ __time32_t st_ctime;
+ };
+
+struct _stat64i32 {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ _off_t st_size;
+ __time64_t st_atime;
+ __time64_t st_mtime;
+ __time64_t st_ctime;
+ };
+
+struct _stat64 {
+ _dev_t st_dev;
+ _ino_t st_ino;
+ unsigned short st_mode;
+ short st_nlink;
+ short st_uid;
+ short st_gid;
+ _dev_t st_rdev;
+ __int64 st_size;
+ __time64_t st_atime;
+ __time64_t st_mtime;
+ __time64_t st_ctime;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl _wstat32( const wchar_t * _Name, struct _stat32 * _Stat);
+
+
+ int __cdecl _wstat32i64( const wchar_t * _Name, struct _stat32i64 * _Stat);
+ int __cdecl _wstat64i32( const wchar_t * _Name, struct _stat64i32 * _Stat);
+ int __cdecl _wstat64( const wchar_t * _Name, struct _stat64 * _Stat);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ errno_t __cdecl _cgetws_s( wchar_t * _Buffer, size_t _SizeInWords, size_t * _SizeRead);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _cgetws_s( wchar_t (&_Buffer)[_Size], size_t * _Size) { return _cgetws_s(_Buffer, _Size, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cgetws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _cgetws( wchar_t *_Buffer);
+ wint_t __cdecl _getwch(void);
+ wint_t __cdecl _getwche(void);
+ wint_t __cdecl _putwch(wchar_t _WCh);
+ wint_t __cdecl _ungetwch(wint_t _WCh);
+ int __cdecl _cputws( const wchar_t * _String);
+ int __cdecl _cwprintf( const wchar_t * _Format, ...);
+ int __cdecl _cwprintf_s( const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _cwscanf( const wchar_t * _Format, ...);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _cwscanf_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _cwscanf_s( const wchar_t * _Format, ...);
+ int __cdecl _cwscanf_s_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vcwprintf( const wchar_t *_Format, va_list _ArgList);
+ int __cdecl _vcwprintf_s( const wchar_t *_Format, va_list _ArgList);
+
+ int __cdecl _cwprintf_p( const wchar_t * _Format, ...);
+ int __cdecl _vcwprintf_p( const wchar_t* _Format, va_list _ArgList);
+
+ int __cdecl _cwprintf_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _cwprintf_s_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vcwprintf_l( const wchar_t *_Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _vcwprintf_s_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+ int __cdecl _cwprintf_p_l( const wchar_t * _Format, _locale_t _Locale, ...);
+ int __cdecl _vcwprintf_p_l( const wchar_t * _Format, _locale_t _Locale, va_list _ArgList);
+
+ wint_t __cdecl _putwch_nolock(wchar_t _WCh);
+ wint_t __cdecl _getwch_nolock(void);
+ wint_t __cdecl _getwche_nolock(void);
+ wint_t __cdecl _ungetwch_nolock(wint_t _WCh);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ errno_t __cdecl _itow_s ( int _Val, wchar_t * _DstBuf, size_t _SizeInWords, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _itow_s( int _Value, wchar_t (&_Dest)[_Size], int _Radix) { return _itow_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _itow( int _Value, wchar_t *_Dest, int _Radix);
+ errno_t __cdecl _ltow_s ( long _Val, wchar_t * _DstBuf, size_t _SizeInWords, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltow_s( long _Value, wchar_t (&_Dest)[_Size], int _Radix) { return _ltow_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ltow( long _Value, wchar_t *_Dest, int _Radix);
+ errno_t __cdecl _ultow_s ( unsigned long _Val, wchar_t * _DstBuf, size_t _SizeInWords, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultow_s( unsigned long _Value, wchar_t (&_Dest)[_Size], int _Radix) { return _ultow_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ultow( unsigned long _Value, wchar_t *_Dest, int _Radix);
+ double __cdecl wcstod( const wchar_t * _Str, wchar_t ** _EndPtr);
+ double __cdecl _wcstod_l( const wchar_t *_Str, wchar_t ** _EndPtr, _locale_t _Locale);
+ long __cdecl wcstol( const wchar_t *_Str, wchar_t ** _EndPtr, int _Radix);
+ long __cdecl _wcstol_l( const wchar_t *_Str, wchar_t **_EndPtr, int _Radix, _locale_t _Locale);
+ unsigned long __cdecl wcstoul( const wchar_t *_Str, wchar_t ** _EndPtr, int _Radix);
+ unsigned long __cdecl _wcstoul_l( const wchar_t *_Str, wchar_t **_EndPtr, int _Radix, _locale_t _Locale);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wdupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wgetenv( const wchar_t * _VarName);
+ errno_t __cdecl _wgetenv_s( size_t * _ReturnSize, wchar_t * _DstBuf, size_t _DstSizeInWords, const wchar_t * _VarName);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wgetenv_s( size_t * _ReturnSize, wchar_t (&_Dest)[_Size], const wchar_t * _VarName) { return _wgetenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
+
+
+
+
+
+
+ errno_t __cdecl _wdupenv_s( wchar_t **_Buffer, size_t *_BufferSizeInWords, const wchar_t *_VarName);
+
+
+
+
+
+
+
+
+ double __cdecl _wtof( const wchar_t *_Str);
+ double __cdecl _wtof_l( const wchar_t *_Str, _locale_t _Locale);
+ int __cdecl _wtoi( const wchar_t *_Str);
+ int __cdecl _wtoi_l( const wchar_t *_Str, _locale_t _Locale);
+ long __cdecl _wtol( const wchar_t *_Str);
+ long __cdecl _wtol_l( const wchar_t *_Str, _locale_t _Locale);
+
+
+ errno_t __cdecl _i64tow_s( __int64 _Val, wchar_t * _DstBuf, size_t _SizeInWords, int _Radix);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i65tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _i64tow( __int64 _Val, wchar_t * _DstBuf, int _Radix);
+ errno_t __cdecl _ui64tow_s( unsigned __int64 _Val, wchar_t * _DstBuf, size_t _SizeInWords, int _Radix);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ui64tow( unsigned __int64 _Val, wchar_t * _DstBuf, int _Radix);
+ __int64 __cdecl _wtoi64( const wchar_t *_Str);
+ __int64 __cdecl _wtoi64_l( const wchar_t *_Str, _locale_t _Locale);
+ __int64 __cdecl _wcstoi64( const wchar_t * _Str, wchar_t ** _EndPtr, int _Radix);
+ __int64 __cdecl _wcstoi64_l( const wchar_t * _Str, wchar_t ** _EndPtr, int _Radix, _locale_t _Locale);
+ unsigned __int64 __cdecl _wcstoui64( const wchar_t * _Str, wchar_t ** _EndPtr, int _Radix);
+ unsigned __int64 __cdecl _wcstoui64_l( const wchar_t *_Str , wchar_t ** _EndPtr, int _Radix, _locale_t _Locale);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wchar_t * __cdecl _wfullpath( wchar_t * _FullPath, const wchar_t * _Path, size_t _SizeInWords);
+
+
+
+
+
+ errno_t __cdecl _wmakepath_s( wchar_t * _PathResult, size_t _SizeInWords, const wchar_t * _Drive, const wchar_t * _Dir, const wchar_t * _Filename,
+ const wchar_t * _Ext);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmakepath_s( wchar_t (&_ResultPath)[_Size], const wchar_t * _Drive, const wchar_t * _Dir, const wchar_t * _Filename, const wchar_t * _Ext) { return _wmakepath_s(_ResultPath, _Size, _Drive, _Dir, _Filename, _Ext); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmakepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _wmakepath( wchar_t *_ResultPath, const wchar_t * _Drive, const wchar_t * _Dir, const wchar_t * _Filename, const wchar_t * _Ext);
+
+
+
+
+ int __cdecl _wputenv( const wchar_t * _EnvString);
+ errno_t __cdecl _wputenv_s( const wchar_t * _Name, const wchar_t * _Value);
+ errno_t __cdecl _wsearchenv_s( const wchar_t * _Filename, const wchar_t * _EnvVar, wchar_t * _ResultPath, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wsearchenv_s( const wchar_t * _Filename, const wchar_t * _EnvVar, wchar_t (&_ResultPath)[_Size]) { return _wsearchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsearchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _wsearchenv( const wchar_t * _Filename, const wchar_t * _EnvVar, wchar_t *_ResultPath);
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsplitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _wsplitpath( const wchar_t * _FullPath, wchar_t * _Drive, wchar_t * _Dir, wchar_t * _Filename, wchar_t * _Ext);
+ errno_t __cdecl _wsplitpath_s( const wchar_t * _FullPath,
+ wchar_t * _Drive, size_t _DriveSizeInWords,
+ wchar_t * _Dir, size_t _DirSizeInWords,
+ wchar_t * _Filename, size_t _FilenameSizeInWords,
+ wchar_t * _Ext, size_t _ExtSizeInWords);
+extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _wsplitpath_s( const wchar_t *_Path, wchar_t (&_Drive)[_DriveSize], wchar_t (&_Dir)[_DirSize], wchar_t (&_Name)[_NameSize], wchar_t (&_Ext)[_ExtSize]) { return _wsplitpath_s(_Path, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+ };
+
+
+
+
+
+
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wasctime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wasctime( const struct tm * _Tm);
+ errno_t __cdecl _wasctime_s( wchar_t *_Buf, size_t _SizeInWords, const struct tm * _Tm);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wasctime_s( wchar_t (&_Buffer)[_Size], const struct tm * _Time) { return _wasctime_s(_Buffer, _Size, _Time); } }
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime32_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wctime32( const __time32_t *_Time);
+ errno_t __cdecl _wctime32_s( wchar_t* _Buf, size_t _SizeInWords, const __time32_t * _Time);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime32_s( wchar_t (&_Buffer)[_Size], const __time32_t * _Time) { return _wctime32_s(_Buffer, _Size, _Time); } }
+
+ size_t __cdecl wcsftime( wchar_t * _Buf, size_t _SizeInWords, const wchar_t * _Format, const struct tm * _Tm);
+ size_t __cdecl _wcsftime_l( wchar_t * _Buf, size_t _SizeInWords, const wchar_t *_Format, const struct tm *_Tm, _locale_t _Locale);
+
+ errno_t __cdecl _wstrdate_s( wchar_t * _Buf, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrdate_s( wchar_t (&_Buffer)[_Size]) { return _wstrdate_s(_Buffer, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrdate_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wstrdate( wchar_t *_Buffer);
+
+ errno_t __cdecl _wstrtime_s( wchar_t * _Buf, size_t _SizeInWords);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrtime_s( wchar_t (&_Buffer)[_Size]) { return _wstrtime_s(_Buffer, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrtime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wstrtime( wchar_t *_Buffer);
+
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime64_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _wctime64( const __time64_t * _Time);
+ errno_t __cdecl _wctime64_s( wchar_t* _Buf, size_t _SizeInWords, const __time64_t *_Time);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime64_s( wchar_t (&_Buffer)[_Size], const __time64_t * _Time) { return _wctime64_s(_Buffer, _Size, _Time); } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static __inline wchar_t * __cdecl _wctime(const time_t * _Time)
+{
+#pragma warning( push )
+#pragma warning( disable : 4996 )
+ return _wctime64(_Time);
+#pragma warning( pop )
+}
+
+static __inline errno_t __cdecl _wctime_s(wchar_t *_Buffer, size_t _SizeInWords, const time_t * _Time)
+{
+ return _wctime64_s(_Buffer, _SizeInWords, _Time);
+}
+
+
+#pragma warning(pop)
+
+
+
+
+
+
+
+
+
+
+typedef int mbstate_t;
+typedef wchar_t _Wint_t;
+
+ wint_t __cdecl btowc(int);
+ size_t __cdecl mbrlen( const char * _Ch, size_t _SizeInBytes,
+ mbstate_t * _State);
+ size_t __cdecl mbrtowc( wchar_t * _DstCh, const char * _SrcCh,
+ size_t _SizeInBytes, mbstate_t * _State);
+ errno_t __cdecl mbsrtowcs_s( size_t* _Retval, wchar_t * _Dst, size_t _SizeInWords, const char ** _PSrc, size_t _N, mbstate_t * _State);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl mbsrtowcs_s( size_t * _Retval, wchar_t (&_Dest)[_Size], const char ** _PSource, size_t _Count, mbstate_t * _State) { return mbsrtowcs_s(_Retval, _Dest, _Size, _PSource, _Count, _State); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbsrtowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl mbsrtowcs( wchar_t *_Dest, const char ** _PSrc, size_t _Count, mbstate_t * _State);
+
+ errno_t __cdecl wcrtomb_s( size_t * _Retval, char * _Dst,
+ size_t _SizeInBytes, wchar_t _Ch, mbstate_t * _State);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcrtomb_s( size_t * _Retval, char (&_Dest)[_Size], wchar_t _Source, mbstate_t * _State) { return wcrtomb_s(_Retval, _Dest, _Size, _Source, _State); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcrtomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl wcrtomb( char *_Dest, wchar_t _Source, mbstate_t * _State);
+ errno_t __cdecl wcsrtombs_s( size_t * _Retval, char * _Dst,
+ size_t _SizeInBytes, const wchar_t ** _Src, size_t _Size, mbstate_t * _State);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsrtombs_s( size_t * _Retval, char (&_Dest)[_Size], const wchar_t ** _PSrc, size_t _Count, mbstate_t * _State) { return wcsrtombs_s(_Retval, _Dest, _Size, _PSrc, _Count, _State); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsrtombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl wcsrtombs( char *_Dest, const wchar_t ** _PSource, size_t _Count, mbstate_t * _State);
+ int __cdecl wctob( wint_t _WCh);
+
+
+
+
+
+
+
+ void * __cdecl memmove( void * _Dst, const void * _Src, size_t _MaxCount);
+
+ void * __cdecl memcpy( void * _Dst, const void * _Src, size_t _MaxCount);
+
+ errno_t __cdecl memcpy_s( void * _Dst, rsize_t _DstSize, const void * _Src, rsize_t _MaxCount);
+ errno_t __cdecl memmove_s( void * _Dst, rsize_t _DstSize, const void * _Src, rsize_t _MaxCount);
+
+__inline int __cdecl fwide( FILE * _F, int _M)
+ {(void)_F; return (_M); }
+__inline int __cdecl mbsinit( const mbstate_t *_P)
+ {return (_P == 0 || *_P == 0); }
+__inline const wchar_t * __cdecl wmemchr( const wchar_t *_S, wchar_t _C, size_t _N)
+ {for (; 0 < _N; ++_S, --_N)
+ if (*_S == _C)
+ return (const wchar_t *)(_S);
+ return (0); }
+__inline int __cdecl wmemcmp( const wchar_t *_S1, const wchar_t *_S2, size_t _N)
+ {for (; 0 < _N; ++_S1, ++_S2, --_N)
+ if (*_S1 != *_S2)
+ return (*_S1 < *_S2 ? -1 : +1);
+ return (0); }
+
+__inline wchar_t * __cdecl wmemcpy( wchar_t *_S1, const wchar_t *_S2, size_t _N)
+ {
+#pragma warning( push )
+#pragma warning( disable : 4996 6386 )
+ return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
+#pragma warning( pop )
+ }
+
+
+__inline errno_t __cdecl wmemcpy_s( wchar_t *_S1, rsize_t _N1, const wchar_t *_S2, rsize_t _N)
+ {
+#pragma warning( push )
+#pragma warning( disable : 6386 )
+ return memcpy_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
+ }
+#pragma warning( pop )
+
+
+__inline wchar_t * __cdecl wmemmove( wchar_t *_S1, const wchar_t *_S2, size_t _N)
+ {
+#pragma warning( push )
+#pragma warning( disable : 4996 6386 )
+#pragma warning( disable : 6387)
+
+ return (wchar_t *)memmove(_S1, _S2, _N*sizeof(wchar_t));
+#pragma warning( pop )
+ }
+
+
+__inline errno_t __cdecl wmemmove_s( wchar_t *_S1, rsize_t _N1, const wchar_t *_S2, rsize_t _N)
+ {
+#pragma warning( push )
+#pragma warning( disable : 6386 )
+ return memmove_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
+#pragma warning( pop )
+ }
+
+
+__inline wchar_t * __cdecl wmemset( wchar_t *_S, wchar_t _C, size_t _N)
+ {
+ wchar_t *_Su = _S;
+ for (; 0 < _N; ++_Su, --_N)
+ {
+ *_Su = _C;
+ }
+ return (_S);
+ }
+
+
+extern "C++" {
+inline wchar_t * __cdecl wmemchr( wchar_t *_S, wchar_t _C, size_t _N)
+ { return (wchar_t *)wmemchr((const wchar_t *)_S, _C, _N); }
+}
+
+
+
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+typedef mbstate_t _Mbstatet;
+
+
+namespace std {
+using ::mbstate_t; using ::size_t; using ::tm; using ::wint_t;
+
+using ::btowc; using ::fgetwc; using ::fgetws; using ::fputwc;
+using ::fputws; using ::fwide; using ::fwprintf;
+using ::fwscanf; using ::getwc; using ::getwchar;
+using ::mbrlen; using ::mbrtowc; using ::mbsrtowcs;
+using ::mbsinit; using ::putwc; using ::putwchar;
+using ::swprintf; using ::swscanf; using ::ungetwc;
+using ::vfwprintf; using ::vswprintf; using ::vwprintf;
+using ::wcrtomb; using ::wprintf; using ::wscanf;
+using ::wcsrtombs; using ::wcstol; using ::wcscat;
+using ::wcschr; using ::wcscmp; using ::wcscoll;
+using ::wcscpy; using ::wcscspn; using ::wcslen;
+using ::wcsncat; using ::wcsncmp; using ::wcsncpy;
+using ::wcspbrk; using ::wcsrchr; using ::wcsspn;
+using ::wcstod; using ::wcstoul; using ::wcsstr;
+using ::wcstok; using ::wcsxfrm; using ::wctob;
+using ::wmemchr; using ::wmemcmp; using ::wmemcpy;
+using ::wmemmove; using ::wmemset; using ::wcsftime;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+typedef void *_HFILE;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef int (__cdecl * _CRT_REPORT_HOOK)(int, char *, int *);
+typedef int (__cdecl * _CRT_REPORT_HOOKW)(int, wchar_t *, int *);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef int (__cdecl * _CRT_ALLOC_HOOK)(int, void *, size_t, int, long, const unsigned char *, int);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef void (__cdecl * _CRT_DUMP_CLIENT)(void *, size_t);
+
+
+
+
+
+
+
+struct _CrtMemBlockHeader;
+typedef struct _CrtMemState
+{
+ struct _CrtMemBlockHeader * pBlockHeader;
+ size_t lCounts[5];
+ size_t lSizes[5];
+ size_t lHighWaterCount;
+ size_t lTotalCount;
+} _CrtMemState;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+extern "C++" {
+
+
+
+
+
+
+
+
+
+
+
+
+ void * __cdecl operator new[](size_t _Size);
+
+
+ void * __cdecl operator new(
+ size_t _Size,
+ int,
+ const char *,
+ int
+ );
+
+ void * __cdecl operator new[](
+ size_t _Size,
+ int,
+ const char *,
+ int
+ );
+
+
+
+
+void __cdecl operator delete[](void *);
+
+inline void __cdecl operator delete(void * _P, int, const char *, int)
+ { ::operator delete(_P); }
+inline void __cdecl operator delete[](void * _P, int, const char *, int)
+ { ::operator delete[](_P); }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+typedef long streamoff;
+typedef int streamsize;
+
+
+
+
+
+
+extern fpos_t _Fpz;
+extern const streamoff _BADOFF;
+
+
+
+template<class _Statetype>
+ class fpos
+ {
+ typedef fpos<_Statetype> _Myt;
+
+public:
+ fpos(streamoff _Off = 0)
+ : _Myoff(_Off), _Fpos(0), _Mystate(_Stz)
+ {
+ }
+
+ fpos(_Statetype _State, fpos_t _Fileposition)
+ : _Myoff(0), _Fpos(_Fileposition), _Mystate(_State)
+ {
+ }
+
+ _Statetype state() const
+ {
+ return (_Mystate);
+ }
+
+ void state(_Statetype _State)
+ {
+ _Mystate = _State;
+ }
+
+ fpos_t seekpos() const
+ {
+ return (_Fpos);
+ }
+
+ operator streamoff() const
+ {
+ return (_Myoff + ((long)(_Fpos)));
+ }
+
+ streamoff operator-(const _Myt& _Right) const
+ {
+ return ((streamoff)*this - (streamoff)_Right);
+ }
+
+ _Myt& operator+=(streamoff _Off)
+ {
+ _Myoff += _Off;
+ return (*this);
+ }
+
+ _Myt& operator-=(streamoff _Off)
+ {
+ _Myoff -= _Off;
+ return (*this);
+ }
+
+ _Myt operator+(streamoff _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ _Myt operator-(streamoff _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ bool operator==(const _Myt& _Right) const
+ {
+ return ((streamoff)*this == (streamoff)_Right);
+ }
+
+ bool operator!=(const _Myt& _Right) const
+ {
+ return (!(*this == _Right));
+ }
+
+private:
+ static const _Statetype _Stz;
+ streamoff _Myoff;
+ fpos_t _Fpos;
+ _Statetype _Mystate;
+ };
+
+
+template<class _Statetype>
+ const _Statetype fpos<_Statetype>::_Stz = _Statetype();
+
+
+
+
+
+
+typedef fpos<_Mbstatet> streampos;
+typedef streampos wstreampos;
+
+
+struct _Unsecure_char_traits_tag
+ {
+ };
+struct _Secure_char_traits_tag
+ {
+ };
+
+
+
+
+
+
+struct _Char_traits_base
+ {
+ typedef _Unsecure_char_traits_tag _Secure_char_traits;
+ };
+
+
+
+
+template<class _Elem>
+ struct char_traits:
+ public _Char_traits_base
+ {
+ typedef _Elem char_type;
+ typedef long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef _Mbstatet state_type;
+
+ static void __cdecl assign(_Elem& _Left, const _Elem& _Right)
+ {
+ _Left = _Right;
+ }
+
+ static bool __cdecl eq(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static bool __cdecl lt(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left < _Right);
+ }
+
+ static int __cdecl compare(const _Elem *_First1,
+ const _Elem *_First2, size_t _Count)
+ {
+
+
+ for (; 0 < _Count; --_Count, ++_First1, ++_First2)
+ if (!eq(*_First1, *_First2))
+ return (lt(*_First1, *_First2) ? -1 : +1);
+ return (0);
+ }
+
+ static size_t __cdecl length(const _Elem *_First)
+ {
+
+ size_t _Count;
+ for (_Count = 0; !eq(*_First, _Elem()); ++_First)
+ ++_Count;
+ return (_Count);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl copy(_Elem *_First1,
+ const _Elem *_First2, size_t _Count)
+ {
+
+ return _Copy_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Copy_s(_Elem *_First1, size_t _Dest_size,
+ const _Elem *_First2, size_t _Count)
+ {
+
+
+ { if (!(_Dest_size >= _Count)) { ((void)0); ::_invalid_parameter_noinfo(); return (0); } };
+ _Elem *_Next = _First1;
+ for (; 0 < _Count; --_Count, ++_Next, ++_First2)
+ assign(*_Next, *_First2);
+ return (_First1);
+ }
+
+ static const _Elem *__cdecl find(const _Elem *_First,
+ size_t _Count, const _Elem& _Ch)
+ {
+
+ for (; 0 < _Count; --_Count, ++_First)
+ if (eq(*_First, _Ch))
+ return (_First);
+ return (0);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl move(_Elem *_First1,
+ const _Elem *_First2, size_t _Count)
+ {
+
+ return _Move_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Move_s(_Elem *_First1, size_t _Dest_size,
+ const _Elem *_First2, size_t _Count)
+ {
+
+
+ { if (!(_Dest_size >= _Count)) { ((void)0); ::_invalid_parameter_noinfo(); return (0); } };
+ _Elem *_Next = _First1;
+ if (_First2 < _Next && _Next < _First2 + _Count)
+ for (_Next += _Count, _First2 += _Count; 0 < _Count; --_Count)
+ assign(*--_Next, *--_First2);
+ else
+ for (; 0 < _Count; --_Count, ++_Next, ++_First2)
+ assign(*_Next, *_First2);
+ return (_First1);
+ }
+
+ static _Elem *__cdecl assign(_Elem *_First,
+ size_t _Count, _Elem _Ch)
+ {
+
+ _Elem *_Next = _First;
+ for (; 0 < _Count; --_Count, ++_Next)
+ assign(*_Next, _Ch);
+ return (_First);
+ }
+
+ static _Elem __cdecl to_char_type(const int_type& _Meta)
+ {
+ return ((_Elem)_Meta);
+ }
+
+ static int_type __cdecl to_int_type(const _Elem& _Ch)
+ {
+ return ((int_type)_Ch);
+ }
+
+ static bool __cdecl eq_int_type(const int_type& _Left,
+ const int_type& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static int_type __cdecl eof()
+ {
+ return ((int_type)(-1));
+ }
+
+ static int_type __cdecl not_eof(const int_type& _Meta)
+ {
+ return (_Meta != eof() ? (int_type)_Meta : (int_type)!eof());
+ }
+ };
+
+
+template<> struct char_traits<wchar_t>:
+ public _Char_traits_base
+ {
+ typedef wchar_t _Elem;
+ typedef _Elem char_type;
+ typedef wint_t int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef _Mbstatet state_type;
+
+ static void __cdecl assign(_Elem& _Left, const _Elem& _Right)
+ {
+ _Left = _Right;
+ }
+
+ static bool __cdecl eq(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static bool __cdecl lt(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left < _Right);
+ }
+
+ static int __cdecl compare(const _Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ return (::wmemcmp(_First1, _First2, _Count));
+ }
+
+ static size_t __cdecl length(const _Elem *_First)
+ {
+
+ return (::wcslen(_First));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl copy(_Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+ return _Copy_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Copy_s(_Elem *_First1, size_t _Size_in_words, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ ::wmemcpy_s((_First1), (_Size_in_words), (_First2), (_Count));
+ return _First1;
+ }
+
+ static const _Elem *__cdecl find(const _Elem *_First, size_t _Count,
+ const _Elem& _Ch)
+ {
+
+ return ((const _Elem *)::wmemchr(_First, _Ch, _Count));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl move(_Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+ return _Move_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Move_s(_Elem *_First1, size_t _Size_in_words, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ ::wmemmove_s((_First1), (_Size_in_words), (_First2), (_Count));
+ return (_Elem *)_First1;
+ }
+
+ static _Elem *__cdecl assign(_Elem *_First, size_t _Count, _Elem _Ch)
+ {
+
+ return ((_Elem *)::wmemset(_First, _Ch, _Count));
+ }
+
+ static _Elem __cdecl to_char_type(const int_type& _Meta)
+ {
+ return (_Meta);
+ }
+
+ static int_type __cdecl to_int_type(const _Elem& _Ch)
+ {
+ return (_Ch);
+ }
+
+ static bool __cdecl eq_int_type(const int_type& _Left,
+ const int_type& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static int_type __cdecl eof()
+ {
+ return ((wint_t)(0xFFFF));
+ }
+
+ static int_type __cdecl not_eof(const int_type& _Meta)
+ {
+ return (_Meta != eof() ? _Meta : !eof());
+ }
+ };
+
+
+
+template<> struct char_traits<char>:
+ public _Char_traits_base
+ {
+ typedef char _Elem;
+ typedef _Elem char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef _Mbstatet state_type;
+
+ static void __cdecl assign(_Elem& _Left, const _Elem& _Right)
+ {
+ _Left = _Right;
+ }
+
+ static bool __cdecl eq(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static bool __cdecl lt(const _Elem& _Left, const _Elem& _Right)
+ {
+ return (_Left < _Right);
+ }
+
+ static int __cdecl compare(const _Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ return (::memcmp(_First1, _First2, _Count));
+ }
+
+ static size_t __cdecl length(const _Elem *_First)
+ {
+
+ return (::strlen(_First));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl copy(_Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+ return _Copy_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Copy_s(_Elem *_First1, size_t _Size_in_bytes, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ ::memcpy_s((_First1), (_Size_in_bytes), (_First2), (_Count));
+ return _First1;
+ }
+
+ static const _Elem *__cdecl find(const _Elem *_First, size_t _Count,
+ const _Elem& _Ch)
+ {
+
+ return ((const _Elem *)::memchr(_First, _Ch, _Count));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ static _Elem *__cdecl move(_Elem *_First1, const _Elem *_First2,
+ size_t _Count)
+ {
+
+ return _Move_s(_First1, _Count, _First2, _Count);
+ }
+
+ static _Elem *__cdecl _Move_s(_Elem *_First1, size_t _Size_in_bytes, const _Elem *_First2,
+ size_t _Count)
+ {
+
+
+ ::memmove_s((_First1), (_Size_in_bytes), (_First2), (_Count));
+ return _First1;
+ }
+
+ static _Elem *__cdecl assign(_Elem *_First, size_t _Count, _Elem _Ch)
+ {
+
+ return ((_Elem *)::memset(_First, _Ch, _Count));
+ }
+
+ static _Elem __cdecl to_char_type(const int_type& _Meta)
+ {
+ return ((_Elem)_Meta);
+ }
+
+ static int_type __cdecl to_int_type(const _Elem& _Ch)
+ {
+ return ((unsigned char)_Ch);
+ }
+
+ static bool __cdecl eq_int_type(const int_type& _Left,
+ const int_type& _Right)
+ {
+ return (_Left == _Right);
+ }
+
+ static int_type __cdecl eof()
+ {
+ return ((-1));
+ }
+
+ static int_type __cdecl not_eof(const int_type& _Meta)
+ {
+ return (_Meta != eof() ? _Meta : !eof());
+ }
+ };
+
+
+ template <class _Traits>
+ class _Inherits_from_char_traits_base
+ {
+ typedef char _True;
+ class _False { char _Dummy[2]; };
+ static _True _Inherits(_Char_traits_base);
+ static _False _Inherits(...);
+ static _Traits _Make_traits();
+
+ public:
+ enum { _Exists = sizeof(_Inherits(_Make_traits())) == sizeof(_True) };
+ };
+
+ template <class _Traits, bool _Inherits_from_char_traits_base>
+ class _Char_traits_category_helper
+ {
+ public:
+ typedef _Unsecure_char_traits_tag _Secure_char_traits;
+ };
+
+
+
+ template <class _Elem>
+ class _Char_traits_category_helper< char_traits<_Elem> , true>
+ {
+ public:
+ typedef _Secure_char_traits_tag _Secure_char_traits;
+ };
+
+ template <class _Traits>
+ class _Char_traits_category_helper<_Traits, true>
+ {
+ public:
+ typedef typename _Traits::_Secure_char_traits _Secure_char_traits;
+ };
+
+ template <class _Traits>
+ class _Char_traits_category
+ {
+ public:
+ typedef typename _Char_traits_category_helper<_Traits, _Inherits_from_char_traits_base<_Traits>::_Exists>::_Secure_char_traits _Secure_char_traits;
+ };
+
+
+
+ template<class _Traits>
+ inline
+ typename _Char_traits_category<_Traits>::_Secure_char_traits _Char_traits_cat()
+ {
+ typename _Char_traits_category<_Traits>::_Secure_char_traits _Secure;
+ return (_Secure);
+ }
+
+ namespace _Traits_helper
+ {
+
+
+ template<class _Traits>
+ inline
+ typename _Traits::char_type *copy_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count)
+ {
+ return copy_s<_Traits>(_First1, _Size, _First2, _Count, _Char_traits_cat<_Traits>());
+ }
+
+ template<class _Traits>
+ inline
+ typename _Traits::char_type *copy_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count, _Secure_char_traits_tag)
+ {
+ return _Traits::_Copy_s(_First1, _Size, _First2, _Count);
+ }
+
+
+ template<class _Traits>
+ inline
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ typename _Traits::char_type *copy_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count, _Unsecure_char_traits_tag)
+ {
+ return _Traits::copy(_First1, _First2, _Count);
+ }
+
+
+ template<class _Traits>
+ inline
+ typename _Traits::char_type *move_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count)
+ {
+ return move_s<_Traits>(_First1, _Size, _First2, _Count, _Char_traits_cat<_Traits>());
+ }
+
+ template<class _Traits>
+ inline
+ typename _Traits::char_type *move_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count, _Secure_char_traits_tag)
+ {
+ return _Traits::_Move_s(_First1, _Size, _First2, _Count);
+ }
+
+
+ template<class _Traits>
+ inline
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ typename _Traits::char_type *move_s(typename _Traits::char_type *_First1, size_t _Size,
+ const typename _Traits::char_type *_First2, size_t _Count, _Unsecure_char_traits_tag)
+ {
+ return _Traits::move(_First1, _First2, _Count);
+ }
+
+ }
+
+
+template<class _Ty>
+ class allocator;
+class ios_base;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_ios;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class istreambuf_iterator;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class ostreambuf_iterator;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_streambuf;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_istream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_ostream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_iostream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem>,
+ class _Alloc = allocator<_Elem> >
+ class basic_stringbuf;
+template<class _Elem,
+ class _Traits = char_traits<_Elem>,
+ class _Alloc = allocator<_Elem> >
+ class basic_istringstream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem>,
+ class _Alloc = allocator<_Elem> >
+ class basic_ostringstream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem>,
+ class _Alloc = allocator<_Elem> >
+ class basic_stringstream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_filebuf;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_ifstream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_ofstream;
+template<class _Elem,
+ class _Traits = char_traits<_Elem> >
+ class basic_fstream;
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef basic_ios<char, char_traits<char> > ios;
+typedef basic_streambuf<char, char_traits<char> > streambuf;
+typedef basic_istream<char, char_traits<char> > istream;
+typedef basic_ostream<char, char_traits<char> > ostream;
+typedef basic_iostream<char, char_traits<char> > iostream;
+typedef basic_stringbuf<char, char_traits<char>,
+ allocator<char> > stringbuf;
+typedef basic_istringstream<char, char_traits<char>,
+ allocator<char> > istringstream;
+typedef basic_ostringstream<char, char_traits<char>,
+ allocator<char> > ostringstream;
+typedef basic_stringstream<char, char_traits<char>,
+ allocator<char> > stringstream;
+typedef basic_filebuf<char, char_traits<char> > filebuf;
+typedef basic_ifstream<char, char_traits<char> > ifstream;
+typedef basic_ofstream<char, char_traits<char> > ofstream;
+typedef basic_fstream<char, char_traits<char> > fstream;
+
+
+typedef basic_ios<wchar_t, char_traits<wchar_t> > wios;
+typedef basic_streambuf<wchar_t, char_traits<wchar_t> >
+ wstreambuf;
+typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
+typedef basic_ostream<wchar_t, char_traits<wchar_t> > wostream;
+typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;
+typedef basic_stringbuf<wchar_t, char_traits<wchar_t>,
+ allocator<wchar_t> > wstringbuf;
+typedef basic_istringstream<wchar_t, char_traits<wchar_t>,
+ allocator<wchar_t> > wistringstream;
+typedef basic_ostringstream<wchar_t, char_traits<wchar_t>,
+ allocator<wchar_t> > wostringstream;
+typedef basic_stringstream<wchar_t, char_traits<wchar_t>,
+ allocator<wchar_t> > wstringstream;
+typedef basic_filebuf<wchar_t, char_traits<wchar_t> > wfilebuf;
+typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;
+typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;
+typedef basic_fstream<wchar_t, char_traits<wchar_t> > wfstream;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+template<class _Ty> inline
+ void swap(_Ty& _Left, _Ty& _Right)
+ {
+ _Ty _Tmp = _Left;
+ _Left = _Right, _Right = _Tmp;
+ }
+
+
+template<class _Ty1,
+ class _Ty2> struct pair
+ {
+ typedef pair<_Ty1, _Ty2> _Myt;
+ typedef _Ty1 first_type;
+ typedef _Ty2 second_type;
+
+ pair()
+ : first(_Ty1()), second(_Ty2())
+ {
+ }
+
+ pair(const _Ty1& _Val1, const _Ty2& _Val2)
+ : first(_Val1), second(_Val2)
+ {
+ }
+
+ template<class _Other1,
+ class _Other2>
+ pair(const pair<_Other1, _Other2>& _Right)
+ : first(_Right.first), second(_Right.second)
+ {
+ }
+
+ void swap(_Myt& _Right)
+ {
+ std::swap(first, _Right.first);
+ std::swap(second, _Right.second);
+ }
+
+ _Ty1 first;
+ _Ty2 second;
+ };
+
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator==(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (_Left.first == _Right.first && _Left.second == _Right.second);
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator!=(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator<(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (_Left.first < _Right.first ||
+ !(_Right.first < _Left.first) && _Left.second < _Right.second);
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator>(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator<=(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ bool operator>=(const pair<_Ty1, _Ty2>& _Left,
+ const pair<_Ty1, _Ty2>& _Right)
+ {
+ return (!(_Left < _Right));
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ pair<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)
+ {
+ return (pair<_Ty1, _Ty2>(_Val1, _Val2));
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ void swap(pair<_Ty1, _Ty2>& _Left, pair<_Ty1, _Ty2>& _Right)
+ {
+ _Left.swap(_Right);
+ }
+
+
+ namespace rel_ops
+ {
+template<class _Ty> inline
+ bool operator!=(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _Ty> inline
+ bool operator>(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _Ty> inline
+ bool operator<=(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _Ty> inline
+ bool operator>=(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (!(_Left < _Right));
+ }
+ }
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+
+
+struct __type_info_node {
+ void *memPtr;
+ __type_info_node* next;
+};
+
+extern __type_info_node __type_info_root_node;
+
+class type_info {
+public:
+ virtual ~type_info();
+ bool operator==(const type_info& rhs) const;
+ bool operator!=(const type_info& rhs) const;
+ int before(const type_info& rhs) const;
+ const char* name(__type_info_node* __ptype_info_node = &__type_info_root_node) const;
+ const char* raw_name() const;
+private:
+ void *_m_data;
+ char _m_d_name[1];
+ type_info(const type_info& rhs);
+ type_info& operator=(const type_info& rhs);
+ static const char *__cdecl _Name_base(const type_info *,__type_info_node* __ptype_info_node);
+ static void __cdecl _Type_info_dtor(type_info *);
+};
+
+
+
+ namespace std {
+
+using ::type_info;
+
+ }
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+typedef void (__cdecl *terminate_function)();
+typedef void (__cdecl *terminate_handler)();
+typedef void (__cdecl *unexpected_function)();
+typedef void (__cdecl *unexpected_handler)();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct _EXCEPTION_POINTERS;
+
+typedef void (__cdecl *_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS*);
+
+
+ __declspec(noreturn) void __cdecl terminate(void);
+ void __cdecl unexpected(void);
+
+ int __cdecl _is_exception_typeof( const type_info &_Type, struct _EXCEPTION_POINTERS * _ExceptionPtr);
+
+
+
+ terminate_function __cdecl set_terminate( terminate_function _NewPtFunc);
+extern "C" terminate_function __cdecl _get_terminate(void);
+ unexpected_function __cdecl set_unexpected( unexpected_function _NewPtFunc);
+extern "C" unexpected_function __cdecl _get_unexpected(void);
+
+
+
+
+ _se_translator_function __cdecl _set_se_translator( _se_translator_function _NewPtFunc);
+
+ bool __cdecl __uncaught_exception();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef struct _heapinfo {
+ int * _pentry;
+ size_t _size;
+ int _useflag;
+ } _HEAPINFO;
+
+
+
+
+
+
+extern __declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_amblksiz" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) unsigned int _amblksiz;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __declspec(noalias) __declspec(restrict) void * __cdecl calloc( size_t _NumOfElements, size_t _SizeOfElements);
+ __declspec(noalias) void __cdecl free( void * _Memory);
+ __declspec(noalias) __declspec(restrict) void * __cdecl malloc( size_t _Size);
+ __declspec(noalias) __declspec(restrict) void * __cdecl realloc( void * _Memory, size_t _NewSize);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _recalloc( void * _Memory, size_t _Count, size_t _Size);
+ __declspec(noalias) void __cdecl _aligned_free( void * _Memory);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_malloc( size_t _Size, size_t _Alignment);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_offset_malloc( size_t _Size, size_t _Alignment, size_t _Offset);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_realloc( void * _Memory, size_t _Size, size_t _Alignment);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_recalloc( void * _Memory, size_t _Count, size_t _Size, size_t _Alignment);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_offset_realloc( void * _Memory, size_t _Size, size_t _Alignment, size_t _Offset);
+ __declspec(noalias) __declspec(restrict) void * __cdecl _aligned_offset_recalloc( void * _Memory, size_t _Count, size_t _Size, size_t _Alignment, size_t _Offset);
+ size_t __cdecl _aligned_msize( void * _Memory, size_t _Alignment, size_t _Offset);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl _resetstkoflw (void);
+
+
+
+ unsigned long __cdecl _set_malloc_crt_max_wait( unsigned long _NewValue);
+
+
+
+
+
+
+
+
+
+
+ void * __cdecl _expand( void * _Memory, size_t _NewSize);
+ size_t __cdecl _msize( void * _Memory);
+
+
+
+
+
+
+ void * __cdecl _alloca( size_t _Size);
+ size_t __cdecl _get_sbh_threshold(void);
+ int __cdecl _set_sbh_threshold( size_t _NewValue);
+ errno_t __cdecl _set_amblksiz( size_t _Value);
+ errno_t __cdecl _get_amblksiz( size_t * _Value);
+ int __cdecl _heapadd( void * _Memory, size_t _Size);
+ int __cdecl _heapchk(void);
+ int __cdecl _heapmin(void);
+ int __cdecl _heapset( unsigned int _Fill);
+ int __cdecl _heapwalk( _HEAPINFO * _EntryInfo);
+ size_t __cdecl _heapused(size_t * _Used, size_t * _Commit);
+
+ intptr_t __cdecl _get_heap_handle(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef char __static_assert_t[ (sizeof(unsigned int) <= 8) ];
+
+
+__inline void *_MarkAllocaS( void *_Ptr, unsigned int _Marker)
+{
+ if (_Ptr)
+ {
+ *((unsigned int*)_Ptr) = _Marker;
+ _Ptr = (char*)_Ptr + 8;
+ }
+ return _Ptr;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+__declspec(noalias) __inline void __cdecl _freea( void * _Memory)
+{
+ unsigned int _Marker;
+ if (_Memory)
+ {
+ _Memory = (char*)_Memory - 8;
+ _Marker = *(unsigned int *)_Memory;
+ if (_Marker == 0xDDDD)
+ {
+ free(_Memory);
+ }
+
+ else if (_Marker != 0xCCCC)
+ {
+ ((void)0);
+ }
+
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef const char *__exString;
+extern "C" size_t __cdecl strlen(const char *);
+
+extern "C" errno_t __cdecl strcpy_s( char * _Dst, size_t _DstSize, const char * _Src);
+
+
+
+
+
+
+ namespace std {
+
+class exception
+ {
+public:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ exception();
+ exception(const char *const&);
+ exception(const char *const&, int);
+ exception(const exception&);
+ exception& operator=(const exception&);
+ virtual ~exception();
+ virtual const char * what() const;
+
+private:
+ const char *_m_what;
+ int _m_doFree;
+ };
+
+using ::set_terminate; using ::terminate_handler; using ::terminate; using ::set_unexpected; using ::unexpected_handler; using ::unexpected;
+
+typedef void (__cdecl *_Prhand)(const exception&);
+
+
+
+
+
+ bool __cdecl uncaught_exception();
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+
+
+
+
+
+class bad_exception : public exception
+ {
+public:
+ bad_exception(const char *_Message = "bad exception")
+ throw ()
+ : exception(_Message)
+ {
+ }
+
+ virtual ~bad_exception() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+static const char * _bad_alloc_Message = "bad allocation";
+
+
+class bad_alloc : public exception
+ {
+public:
+ bad_alloc(const char *_Message) throw ()
+ : exception(_Message)
+ {
+ }
+
+ bad_alloc() throw ()
+ : exception(_bad_alloc_Message, 1)
+ {
+ }
+
+ virtual ~bad_alloc() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ namespace std {
+
+class bad_cast : public exception {
+public:
+
+
+
+
+
+
+
+
+
+
+ bad_cast(const char * _Message = "bad cast");
+ bad_cast(const bad_cast &);
+ virtual ~bad_cast();
+
+};
+
+class bad_typeid : public exception {
+public:
+
+
+
+
+
+
+
+
+
+
+ bad_typeid(const char * _Message = "bad typeid");
+ bad_typeid(const bad_typeid &);
+ virtual ~bad_typeid();
+
+
+};
+
+class __non_rtti_object : public bad_typeid {
+public:
+
+
+
+
+
+
+
+
+
+
+ __non_rtti_object(const char * _Message);
+ __non_rtti_object(const __non_rtti_object &);
+ virtual ~__non_rtti_object();
+
+};
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost{
+
+
+
+
+ typedef long long long_long_type;
+ typedef unsigned long long ulong_long_type;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+ void __cdecl _wassert( const wchar_t * _Message, const wchar_t *_File, unsigned _Line);
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+ #pragma warning(disable: 4514)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+struct _Unchecked_iterator_tag
+ {
+ };
+struct _Range_checked_iterator_tag
+ {
+ };
+
+
+struct _Unchanged_checked_iterator_base_type_tag
+ {
+ };
+
+struct _Different_checked_iterator_base_type_tag
+ {
+ };
+
+
+struct _Undefined_inner_type_tag
+ {
+ };
+
+
+struct _Undefined_move_tag
+ {
+ };
+
+struct _Swap_move_tag
+ {
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct _Container_base
+ {
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct _Iterator_base
+ {
+ typedef _Unchecked_iterator_tag _Checked_iterator_category;
+ typedef _Unchanged_checked_iterator_base_type_tag _Checked_iterator_base_type;
+ typedef _Undefined_inner_type_tag _Inner_type;
+
+
+ _Iterator_base()
+ : _Mycont(0)
+ {
+ }
+
+ const _Container_base *_Mycont;
+
+ };
+
+
+
+typedef _Iterator_base _Iterator_base_secure;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct input_iterator_tag
+ {
+ };
+
+struct output_iterator_tag
+ {
+ };
+
+struct forward_iterator_tag
+ : public input_iterator_tag
+ {
+ };
+
+struct bidirectional_iterator_tag
+ : public forward_iterator_tag
+ {
+ };
+
+struct random_access_iterator_tag
+ : public bidirectional_iterator_tag
+ {
+ };
+
+struct _Int_iterator_tag
+ {
+ };
+
+struct _Float_iterator_tag
+ {
+ };
+
+
+struct _Nonscalar_ptr_iterator_tag
+ {
+ };
+struct _Scalar_ptr_iterator_tag
+ {
+ };
+
+
+template<class _Category,
+ class _Ty,
+ class _Diff = ptrdiff_t,
+ class _Pointer = _Ty *,
+ class _Reference = _Ty&>
+ struct iterator
+ : public _Iterator_base
+
+ {
+ typedef _Category iterator_category;
+ typedef _Ty value_type;
+ typedef _Diff difference_type;
+ typedef _Diff distance_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+template<class _Category,
+ class _Ty,
+ class _Diff = ptrdiff_t,
+ class _Pointer = _Ty *,
+ class _Reference = _Ty&,
+ class _Base_class = _Iterator_base>
+ struct _Iterator_with_base
+ : public _Base_class
+
+ {
+ typedef _Category iterator_category;
+ typedef _Ty value_type;
+ typedef _Diff difference_type;
+ typedef _Diff distance_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+template<class _Ty,
+ class _Diff,
+ class _Pointer,
+ class _Reference>
+ struct _Bidit
+ : public _Iterator_base
+
+ {
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef _Diff difference_type;
+ typedef _Diff distance_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+template<class _Ty,
+ class _Diff,
+ class _Pointer,
+ class _Reference>
+ struct _Ranit
+ : public _Iterator_base
+
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef _Diff difference_type;
+ typedef _Diff distance_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+template<class _Ty,
+ class _Diff,
+ class _Pointer,
+ class _Reference,
+ class _Base_class>
+ struct _Ranit_base
+ : public _Base_class
+
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef _Diff difference_type;
+ typedef _Diff distance_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+struct _Outit
+ : public iterator<output_iterator_tag, void, void,
+ void, void>
+ {
+ };
+
+template <class _Base_class>
+struct _Outit_with_base
+ : public _Iterator_with_base<output_iterator_tag, void, void,
+ void, void, _Base_class>
+ {
+ };
+
+
+template<class _Iter>
+ struct iterator_traits
+ {
+ typedef typename _Iter::iterator_category iterator_category;
+ typedef typename _Iter::value_type value_type;
+ typedef typename _Iter::difference_type difference_type;
+ typedef difference_type distance_type;
+ typedef typename _Iter::pointer pointer;
+ typedef typename _Iter::reference reference;
+ };
+
+template<class _Ty>
+ struct iterator_traits<_Ty *>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef ptrdiff_t difference_type;
+ typedef ptrdiff_t distance_type;
+ typedef _Ty *pointer;
+ typedef _Ty& reference;
+ };
+
+template<class _Ty>
+ struct iterator_traits<const _Ty *>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef ptrdiff_t difference_type;
+ typedef ptrdiff_t distance_type;
+ typedef const _Ty *pointer;
+ typedef const _Ty& reference;
+ };
+
+template<> struct iterator_traits<_Bool>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef _Bool value_type;
+ typedef _Bool difference_type;
+ typedef _Bool distance_type;
+ typedef _Bool * pointer;
+ typedef _Bool& reference;
+ };
+
+template<> struct iterator_traits<char>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef char value_type;
+ typedef char difference_type;
+ typedef char distance_type;
+ typedef char * pointer;
+ typedef char& reference;
+ };
+
+template<> struct iterator_traits<signed char>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef signed char value_type;
+ typedef signed char difference_type;
+ typedef signed char distance_type;
+ typedef signed char * pointer;
+ typedef signed char& reference;
+ };
+
+template<> struct iterator_traits<unsigned char>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef unsigned char value_type;
+ typedef unsigned char difference_type;
+ typedef unsigned char distance_type;
+ typedef unsigned char * pointer;
+ typedef unsigned char& reference;
+ };
+
+
+template<> struct iterator_traits<wchar_t>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef wchar_t value_type;
+ typedef wchar_t difference_type;
+ typedef wchar_t distance_type;
+ typedef wchar_t * pointer;
+ typedef wchar_t& reference;
+ };
+
+
+template<> struct iterator_traits<short>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef short value_type;
+ typedef short difference_type;
+ typedef short distance_type;
+ typedef short * pointer;
+ typedef short& reference;
+ };
+
+template<> struct iterator_traits<unsigned short>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef unsigned short value_type;
+ typedef unsigned short difference_type;
+ typedef unsigned short distance_type;
+ typedef unsigned short * pointer;
+ typedef unsigned short& reference;
+ };
+
+template<> struct iterator_traits<int>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef int value_type;
+ typedef int difference_type;
+ typedef int distance_type;
+ typedef int * pointer;
+ typedef int& reference;
+ };
+
+template<> struct iterator_traits<unsigned int>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef unsigned int value_type;
+ typedef unsigned int difference_type;
+ typedef unsigned int distance_type;
+ typedef unsigned int * pointer;
+ typedef unsigned int& reference;
+ };
+
+template<> struct iterator_traits<long>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef long value_type;
+ typedef long difference_type;
+ typedef long distance_type;
+ typedef long * pointer;
+ typedef long& reference;
+ };
+
+template<> struct iterator_traits<unsigned long>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef unsigned long value_type;
+ typedef unsigned long difference_type;
+ typedef unsigned long distance_type;
+ typedef unsigned long * pointer;
+ typedef unsigned long& reference;
+ };
+
+template<> struct iterator_traits<double>
+ {
+ typedef _Float_iterator_tag iterator_category;
+ typedef double value_type;
+ typedef double difference_type;
+ typedef double distance_type;
+ typedef double * pointer;
+ typedef double& reference;
+ };
+
+template<> struct iterator_traits<float>
+ {
+ typedef _Float_iterator_tag iterator_category;
+ typedef float value_type;
+ typedef float difference_type;
+ typedef float distance_type;
+ typedef float * pointer;
+ typedef float& reference;
+ };
+
+
+template<> struct iterator_traits<__int64>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef __int64 value_type;
+ typedef __int64 difference_type;
+ typedef __int64 distance_type;
+ typedef __int64 * pointer;
+ typedef __int64& reference;
+ };
+
+template<> struct iterator_traits<unsigned __int64>
+ {
+ typedef _Int_iterator_tag iterator_category;
+ typedef unsigned __int64 value_type;
+ typedef unsigned __int64 difference_type;
+ typedef unsigned __int64 distance_type;
+ typedef unsigned __int64 * pointer;
+ typedef unsigned __int64& reference;
+ };
+
+
+
+template<class _Iter> inline
+ typename iterator_traits<_Iter>::iterator_category
+ __cdecl _Iter_cat(const _Iter&)
+ {
+ typename iterator_traits<_Iter>::iterator_category _Cat;
+ return (_Cat);
+ }
+
+
+
+
+template<class _Cat1, class _Cat2>
+ class _Iter_random_helper
+ {
+ public:
+ typedef forward_iterator_tag _Iter_random_cat;
+ };
+
+template<>
+ class _Iter_random_helper<random_access_iterator_tag, random_access_iterator_tag>
+ {
+ public:
+ typedef random_access_iterator_tag _Iter_random_cat;
+ };
+
+template<class _Cat1, class _Cat2, class _Cat3>
+ class _Iter_random_helper3
+ {
+ public:
+ typedef forward_iterator_tag _Iter_random_cat;
+ };
+
+template<>
+ class _Iter_random_helper3<random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag>
+ {
+ public:
+ typedef random_access_iterator_tag _Iter_random_cat;
+ };
+
+template<class _Iter1, class _Iter2> inline
+ typename _Iter_random_helper<
+ typename iterator_traits<_Iter1>::iterator_category,
+ typename iterator_traits<_Iter2>::iterator_category>::_Iter_random_cat
+ __cdecl _Iter_random(const _Iter1&, const _Iter2&)
+ {
+ typename _Iter_random_helper<
+ iterator_traits<_Iter1>::iterator_category,
+ iterator_traits<_Iter2>::iterator_category>::_Iter_random_cat _Cat;
+ return (_Cat);
+ }
+
+template<class _Iter1, class _Iter2, class _Iter3> inline
+ typename _Iter_random_helper3<
+ typename iterator_traits<_Iter1>::iterator_category,
+ typename iterator_traits<_Iter2>::iterator_category,
+ typename iterator_traits<_Iter3>::iterator_category>::_Iter_random_cat
+ __cdecl _Iter_random(const _Iter1&, const _Iter2&, const _Iter3&)
+ {
+ typename _Iter_random_helper3<
+ iterator_traits<_Iter1>::iterator_category,
+ iterator_traits<_Iter2>::iterator_category,
+ iterator_traits<_Iter3>::iterator_category>::_Iter_random_cat _Cat;
+ return (_Cat);
+ }
+
+
+
+ template <bool _Cond, class _Ty1, class _Ty2>
+ class _If
+ {
+ public:
+ typedef _Ty2 _Result;
+ };
+
+ template <class _Ty1, class _Ty2>
+ class _If<true, _Ty1, _Ty2>
+ {
+ public:
+ typedef _Ty1 _Result;
+ };
+
+
+ template <bool _Secure_validation>
+ class _Secure_validation_helper
+ {
+ public:
+ typedef _Unchecked_iterator_tag _Checked_iterator_category;
+ };
+
+ template <>
+ class _Secure_validation_helper<true>
+ {
+ public:
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+ };
+
+
+
+ template <class _Iter, bool _Inherits_from_iterator_base>
+ class _Checked_iterator_category_helper
+ {
+ public:
+ typedef _Unchecked_iterator_tag _Checked_cat;
+ };
+
+ template <class _Iter>
+ class _Checked_iterator_category_helper<_Iter, true>
+ {
+ public:
+ typedef typename _Iter::_Checked_iterator_category _Checked_cat;
+ };
+
+ template <class _Iter>
+ class _Checked_iterator_category
+ {
+ public:
+ typedef typename _Checked_iterator_category_helper<_Iter, __is_base_of(_Iterator_base, _Iter)>::_Checked_cat _Checked_cat;
+ };
+
+ template<class _Iter>
+ inline
+ typename _Checked_iterator_category<_Iter>::_Checked_cat _Checked_cat(const _Iter&)
+ {
+ typename _Checked_iterator_category<_Iter>::_Checked_cat _Cat;
+ return (_Cat);
+ }
+
+
+ template <class _Iter, bool _Inherits_from_iterator_base>
+ class _Checked_iterator_base_helper2
+ {
+ public:
+ typedef _Unchanged_checked_iterator_base_type_tag _Checked_iterator_base_type;
+ };
+
+ template <class _Iter>
+ class _Checked_iterator_base_helper2<_Iter, true>
+ {
+ public:
+ typedef typename _Iter::_Checked_iterator_base_type _Checked_iterator_base_type;
+ };
+
+ template <class _Iter, class _Base_type>
+ class _Checked_iterator_base_helper1
+ {
+ public:
+ typedef _Different_checked_iterator_base_type_tag _Base_type_tag;
+ typedef _Base_type _Checked_iterator_base_type;
+ };
+
+ template <class _Iter>
+ class _Checked_iterator_base_helper1<_Iter, _Unchanged_checked_iterator_base_type_tag>
+ {
+ public:
+ typedef _Unchanged_checked_iterator_base_type_tag _Base_type_tag;
+ typedef _Iter _Checked_iterator_base_type;
+ };
+
+ template <class _Iter>
+ class _Checked_iterator_base_helper
+ {
+ public:
+ typedef _Checked_iterator_base_helper2<_Iter, __is_base_of(_Iterator_base, _Iter)> _Base_helper2;
+ typedef _Checked_iterator_base_helper1<_Iter, typename _Base_helper2::_Checked_iterator_base_type > _Base_helper1;
+
+ typedef typename _Base_helper1::_Base_type_tag _Checked_iterator_base_type_tag;
+ typedef typename _Base_helper1::_Checked_iterator_base_type _Checked_iterator_base_type;
+ };
+
+ template<class _Iter, class _Base_tag>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(const _Iter &_It, _Base_tag)
+ {
+ return _It._Checked_iterator_base();
+ }
+
+ template<class _Iter>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(const _Iter &_It, _Unchanged_checked_iterator_base_type_tag)
+ {
+ return _It;
+ }
+
+ template<class _Iter, class _Base_tag>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(_Iter &_It, _Base_tag)
+ {
+ return _It._Checked_iterator_base();
+ }
+
+ template<class _Iter>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(_Iter &_It, _Unchanged_checked_iterator_base_type_tag)
+ {
+ return _It;
+ }
+
+ template<class _Iter>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(const _Iter &_It)
+ {
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type_tag _Base_tag;
+ return _Checked_base(_It, _Base_tag);
+ }
+
+ template<class _Iter>
+ inline
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type
+ __cdecl _Checked_base(_Iter &_It)
+ {
+ typename _Checked_iterator_base_helper<_Iter>::_Checked_iterator_base_type_tag _Base_tag;
+ return _Checked_base(_It, _Base_tag);
+ }
+
+
+
+ template<class _DstIter, class _BaseIter>
+ inline
+ void __cdecl _Checked_assign_from_base(_DstIter &_Dest, const _BaseIter &_Src)
+ {
+ _Dest._Checked_iterator_assign_from_base(_Src);
+ }
+
+ template<class _Iter>
+ inline
+ void __cdecl _Checked_assign_from_base(_Iter &_Dest, const _Iter &_Src)
+ {
+ _Dest = _Src;
+ }
+
+
+
+
+
+
+
+ template <class _Value>
+ class _Move_operation_category
+ {
+ public:
+ typedef _Undefined_move_tag _Move_cat;
+ };
+
+ template<class _Iter>
+ inline
+ typename _Move_operation_category<typename iterator_traits<_Iter>::value_type>::_Move_cat _Move_cat(const _Iter&)
+ {
+ typename _Move_operation_category<typename iterator_traits<_Iter>::value_type>::_Move_cat _Cat;
+ return (_Cat);
+ }
+
+
+template<class _T1, class _T2, class _Checked_Cat1, class _Checked_Cat2>
+struct _Ptr_cat_with_checked_cat_helper
+ {
+ typedef _Nonscalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<class _T1, class _T2>
+struct _Ptr_cat_helper
+ {
+ typedef typename _Ptr_cat_with_checked_cat_helper<_T1, _T2,
+ typename _Checked_iterator_category<_T1>::_Checked_cat,
+ typename _Checked_iterator_category<_T2>::_Checked_cat>::_Ptr_cat _Ptr_cat;
+ };
+
+template<class _T1, class _T2, class _Checked_Cat1>
+struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Checked_Cat1, _Range_checked_iterator_tag>
+ {
+ typedef typename _Ptr_cat_helper<_T1, typename _T2::_Inner_type>::_Ptr_cat _Ptr_cat;
+ };
+
+template<class _T1, class _T2, class _Checked_Cat2>
+struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Range_checked_iterator_tag, _Checked_Cat2>
+ {
+ typedef typename _Ptr_cat_helper<typename _T1::_Inner_type, _T2>::_Ptr_cat _Ptr_cat;
+ };
+
+template<class _T1, class _T2>
+struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Range_checked_iterator_tag, _Range_checked_iterator_tag>
+ {
+ typedef typename _Ptr_cat_helper<typename _T1::_Inner_type, typename _T2::_Inner_type>::_Ptr_cat _Ptr_cat;
+ };
+
+template<class _T1>
+struct _Ptr_cat_helper<_T1, _Undefined_inner_type_tag>
+ {
+ typedef _Nonscalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<class _T2>
+struct _Ptr_cat_helper<_Undefined_inner_type_tag, _T2>
+ {
+ typedef _Nonscalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<_Undefined_inner_type_tag, _Undefined_inner_type_tag>
+ {
+ typedef _Nonscalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+template<>
+struct _Ptr_cat_helper<_Bool *, _Bool *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const _Bool *, _Bool *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<char *, char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const char *, char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<signed char *, signed char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const signed char *, signed char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<unsigned char *, unsigned char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const unsigned char *, unsigned char *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+
+template<>
+struct _Ptr_cat_helper<wchar_t *, wchar_t *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const wchar_t *, wchar_t *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+template<>
+struct _Ptr_cat_helper<short *, short *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const short *, short *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<unsigned short *, unsigned short *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const unsigned short *, unsigned short *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<int *, int *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const int *, int *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<unsigned int *, unsigned int *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const unsigned int *, unsigned int *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<long *, long *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const long *, long *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<unsigned long *, unsigned long *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const unsigned long *, unsigned long *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<float *, float *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const float *, float *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<double *, double *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const double *, double *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<long double *, long double *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const long double *, long double *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+
+template<>
+struct _Ptr_cat_helper<__int64 *, __int64 *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const __int64 *, __int64 *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<unsigned __int64 *, unsigned __int64 *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<>
+struct _Ptr_cat_helper<const unsigned __int64 *, unsigned __int64 *>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+
+template<class _Ty>
+struct _Ptr_cat_helper<_Ty **, _Ty **>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<class _Ty>
+struct _Ptr_cat_helper<_Ty **, const _Ty **>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<class _Ty>
+struct _Ptr_cat_helper<_Ty *const *, _Ty **>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+template<class _Ty>
+struct _Ptr_cat_helper<_Ty *const *, const _Ty **>
+ {
+ typedef _Scalar_ptr_iterator_tag _Ptr_cat;
+ };
+
+
+template<class _T1, class _T2> inline
+typename _Ptr_cat_helper<_T1, _T2>::_Ptr_cat __cdecl _Ptr_cat(_T1&, _T2&)
+ {
+ typename _Ptr_cat_helper<_T1, _T2>::_Ptr_cat _Cat;
+ return (_Cat);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Iter> inline
+ typename iterator_traits<_Iter>::value_type *__cdecl _Val_type(_Iter)
+ {
+ return (0);
+ }
+
+
+template<class _InIt,
+ class _Diff> inline
+ void __cdecl advance(_InIt& _Where, _Diff _Off)
+ {
+ _Advance(_Where, _Off, _Iter_cat(_Where));
+ }
+
+template<class _InIt,
+ class _Diff> inline
+ void __cdecl _Advance(_InIt& _Where, _Diff _Off, input_iterator_tag)
+ {
+
+
+
+
+
+
+ for (; 0 < _Off; --_Off)
+ ++_Where;
+ }
+
+template<class _FI,
+ class _Diff> inline
+ void __cdecl _Advance(_FI& _Where, _Diff _Off, forward_iterator_tag)
+ {
+
+
+
+
+
+
+ for (; 0 < _Off; --_Off)
+ ++_Where;
+ }
+
+#pragma warning(push)
+#pragma warning(disable: 6295)
+template<class _BI,
+ class _Diff> inline
+ void __cdecl _Advance(_BI& _Where, _Diff _Off, bidirectional_iterator_tag)
+ {
+ for (; 0 < _Off; --_Off)
+ ++_Where;
+ for (; _Off < 0; ++_Off)
+ --_Where;
+ }
+#pragma warning(pop)
+
+template<class _RI,
+ class _Diff> inline
+ void __cdecl _Advance(_RI& _Where, _Diff _Off, random_access_iterator_tag)
+ {
+ _Where += _Off;
+ }
+
+
+
+template<class _Iter> inline
+ typename iterator_traits<_Iter>::difference_type
+ * __cdecl _Dist_type(_Iter)
+ {
+ return (0);
+ }
+
+
+template<class _InIt,
+ class _Diff> inline
+ void __cdecl _Distance2(_InIt _First, _InIt _Last, _Diff& _Off,
+ input_iterator_tag)
+ {
+ for (; _First != _Last; ++_First)
+ ++_Off;
+ }
+
+template<class _FwdIt,
+ class _Diff> inline
+ void __cdecl _Distance2(_FwdIt _First, _FwdIt _Last, _Diff& _Off,
+ forward_iterator_tag)
+ {
+ for (; _First != _Last; ++_First)
+ ++_Off;
+ }
+
+template<class _BidIt,
+ class _Diff> inline
+ void __cdecl _Distance2(_BidIt _First, _BidIt _Last, _Diff& _Off,
+ bidirectional_iterator_tag)
+ {
+ for (; _First != _Last; ++_First)
+ ++_Off;
+ }
+
+template<class _RanIt,
+ class _Diff> inline
+ void __cdecl _Distance2(_RanIt _First, _RanIt _Last, _Diff& _Off,
+ random_access_iterator_tag)
+ {
+
+
+
+
+
+
+
+
+
+ _Off += _Last - _First;
+ }
+
+template<class _InIt> inline
+ typename iterator_traits<_InIt>::difference_type
+ __cdecl distance(_InIt _First, _InIt _Last)
+ {
+ typename iterator_traits<_InIt>::difference_type _Off = 0;
+ _Distance2(_First, _Last, _Off, _Iter_cat(_First));
+ return (_Off);
+ }
+
+
+template<class _InIt,
+ class _Diff> inline
+ void __cdecl _Distance(_InIt _First, _InIt _Last, _Diff& _Off)
+ {
+ _Distance2(_First, _Last, _Off, _Iter_cat(_First));
+ }
+
+
+template<class _RanIt>
+ class reverse_iterator
+ : public _Iterator_base_secure
+ {
+public:
+ typedef reverse_iterator<_RanIt> _Myt;
+ typedef typename iterator_traits<_RanIt>::iterator_category iterator_category;
+ typedef typename iterator_traits<_RanIt>::value_type value_type;
+ typedef typename iterator_traits<_RanIt>::difference_type difference_type;
+ typedef typename iterator_traits<_RanIt>::difference_type distance_type;
+ typedef typename iterator_traits<_RanIt>::pointer pointer;
+ typedef typename iterator_traits<_RanIt>::reference reference;
+ typedef _RanIt iterator_type;
+
+ reverse_iterator()
+ {
+ }
+
+ explicit reverse_iterator(_RanIt _Right)
+ : current(_Right)
+ {
+ }
+
+ template<class _Other>
+ reverse_iterator(const reverse_iterator<_Other>& _Right)
+ : current(_Right.base())
+ {
+ }
+
+ _RanIt base() const
+ {
+ return (current);
+ }
+
+
+ typedef typename ::std:: _Checked_iterator_category<_RanIt>::_Checked_cat _Checked_iterator_category;
+ typedef reverse_iterator<typename _Checked_iterator_base_helper<_RanIt>::_Checked_iterator_base_type> _Checked_iterator_base_type;
+
+ _Checked_iterator_base_type _Checked_iterator_base() const
+ {
+ typename _Checked_iterator_base_type _Base(::std:: _Checked_base(current));
+ return _Base;
+ }
+
+ void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
+ {
+ ::std:: _Checked_assign_from_base(current, _Base.base());
+ }
+
+
+ reference operator*() const
+ {
+ _RanIt _Tmp = current;
+ return (*--_Tmp);
+ }
+
+ pointer operator->() const
+ {
+ return (&**this);
+ }
+
+ _Myt& operator++()
+ {
+ --current;
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ --current;
+ return (_Tmp);
+ }
+
+ _Myt& operator--()
+ {
+ ++current;
+ return (*this);
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ ++current;
+ return (_Tmp);
+ }
+
+ template<class _Other>
+ bool _Equal(const reverse_iterator<_Other>& _Right) const
+ {
+ return (current == _Right.base());
+ }
+
+
+
+ _Myt& operator+=(difference_type _Off)
+ {
+ current -= _Off;
+ return (*this);
+ }
+
+ _Myt operator+(difference_type _Off) const
+ {
+ return (_Myt(current - _Off));
+ }
+
+ _Myt& operator-=(difference_type _Off)
+ {
+ current += _Off;
+ return (*this);
+ }
+
+ _Myt operator-(difference_type _Off) const
+ {
+ return (_Myt(current + _Off));
+ }
+
+ reference operator[](difference_type _Off) const
+ {
+ return (*(*this + _Off));
+ }
+
+ template<class _Other>
+ bool _Less(const reverse_iterator<_Other>& _Right) const
+ {
+ return (_Right.base() < current);
+ }
+
+ template<class _Other>
+ difference_type _Minus(const reverse_iterator<_Other>& _Right) const
+ {
+ return (_Right.base() - current);
+ }
+
+protected:
+ _RanIt current;
+ };
+
+
+template<class _RanIt,
+ class _Diff> inline
+ reverse_iterator<_RanIt> __cdecl operator+(_Diff _Off,
+ const reverse_iterator<_RanIt>& _Right)
+ {
+ return (_Right + _Off);
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ typename reverse_iterator<_RanIt1>::difference_type
+ __cdecl operator-(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (_Left._Minus(_Right));
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator==(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (_Left._Equal(_Right));
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator!=(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator<(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (_Left._Less(_Right));
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator>(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator<=(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _RanIt1,
+ class _RanIt2> inline
+ bool __cdecl operator>=(const reverse_iterator<_RanIt1>& _Left,
+ const reverse_iterator<_RanIt2>& _Right)
+ {
+ return (!(_Left < _Right));
+ }
+
+
+template<class _BidIt,
+ class _Ty,
+ class _Reference = _Ty&,
+ class _Pointer = _Ty *,
+ class _Diff = ptrdiff_t>
+ class reverse_bidirectional_iterator
+ : public iterator<bidirectional_iterator_tag, _Ty, _Diff,
+ _Pointer, _Reference>
+ {
+public:
+ typedef reverse_bidirectional_iterator<_BidIt, _Ty, _Reference,
+ _Pointer, _Diff> _Myt;
+ typedef _BidIt iterator_type;
+
+ reverse_bidirectional_iterator()
+ {
+ }
+
+ explicit reverse_bidirectional_iterator(_BidIt _Right)
+ : current(_Right)
+ {
+ }
+
+ _BidIt base() const
+ {
+ return (current);
+ }
+
+ _Reference operator*() const
+ {
+ _BidIt _Tmp = current;
+ return (*--_Tmp);
+ }
+
+ _Pointer operator->() const
+ {
+ _Reference _Tmp = **this;
+ return (&_Tmp);
+ }
+
+ _Myt& operator++()
+ {
+ --current;
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ --current;
+ return (_Tmp);
+ }
+
+ _Myt& operator--()
+ {
+ ++current;
+ return (*this);
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ ++current;
+ return (_Tmp);
+ }
+
+ bool operator==(const _Myt& _Right) const
+ {
+ return (current == _Right.current);
+ }
+
+ bool operator!=(const _Myt& _Right) const
+ {
+ return (!(*this == _Right));
+ }
+
+protected:
+ _BidIt current;
+ };
+
+
+template<class _BidIt,
+ class _BidIt2 = _BidIt>
+ class _Revbidit
+ : public iterator<
+ typename iterator_traits<_BidIt>::iterator_category,
+ typename iterator_traits<_BidIt>::value_type,
+ typename iterator_traits<_BidIt>::difference_type,
+ typename iterator_traits<_BidIt>::pointer,
+ typename iterator_traits<_BidIt>::reference>
+ {
+public:
+ typedef _Revbidit<_BidIt, _BidIt2> _Myt;
+ typedef typename iterator_traits<_BidIt>::difference_type _Diff;
+ typedef typename iterator_traits<_BidIt>::pointer _Pointer;
+ typedef typename iterator_traits<_BidIt>::reference _Reference;
+ typedef _BidIt iterator_type;
+
+ _Revbidit()
+ {
+ }
+
+ explicit _Revbidit(_BidIt _Right)
+ : current(_Right)
+ {
+ }
+
+ _Revbidit(const _Revbidit<_BidIt2>& _Other)
+ : current (_Other.base())
+ {
+ }
+
+ _BidIt base() const
+ {
+ return (current);
+ }
+
+ _Reference operator*() const
+ {
+ _BidIt _Tmp = current;
+ return (*--_Tmp);
+ }
+
+ _Pointer operator->() const
+ {
+ _Reference _Tmp = **this;
+ return (&_Tmp);
+ }
+
+ _Myt& operator++()
+ {
+ --current;
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ --current;
+ return (_Tmp);
+ }
+
+ _Myt& operator--()
+ {
+ ++current;
+ return (*this);
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ ++current;
+ return (_Tmp);
+ }
+
+ bool operator==(const _Myt& _Right) const
+ {
+ return (current == _Right.current);
+ }
+
+ bool operator!=(const _Myt& _Right) const
+ {
+ return (!(*this == _Right));
+ }
+
+protected:
+ _BidIt current;
+ };
+
+
+template<class _Elem,
+ class _Traits>
+ class istreambuf_iterator
+ : public _Iterator_with_base<input_iterator_tag,
+ _Elem, typename _Traits::off_type, _Elem *, _Elem&, _Iterator_base_secure>
+ {
+ typedef istreambuf_iterator<_Elem, _Traits> _Myt;
+public:
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_Elem, _Traits> streambuf_type;
+ typedef basic_istream<_Elem, _Traits> istream_type;
+ typedef typename traits_type::int_type int_type;
+
+ istreambuf_iterator(streambuf_type *_Sb = 0) throw ()
+ : _Strbuf(_Sb), _Got(_Sb == 0)
+ {
+ }
+
+ istreambuf_iterator(istream_type& _Istr) throw ()
+ : _Strbuf(_Istr.rdbuf()), _Got(_Istr.rdbuf() == 0)
+ {
+ }
+
+ _Elem operator*() const
+ {
+ if (!_Got)
+ ((_Myt *)this)->_Peek();
+
+
+
+
+
+
+ return (_Val);
+ }
+
+ _Myt& operator++()
+ {
+
+
+
+
+
+
+ _Inc();
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ if (!_Got)
+ _Peek();
+ _Myt _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ bool equal(const _Myt& _Right) const
+ {
+ if (!_Got)
+ ((_Myt *)this)->_Peek();
+ if (!_Right._Got)
+ ((_Myt *)&_Right)->_Peek();
+ return (_Strbuf == 0 && _Right._Strbuf == 0
+ || _Strbuf != 0 && _Right._Strbuf != 0);
+ }
+
+private:
+ void _Inc()
+ {
+ if (_Strbuf == 0
+ || traits_type::eq_int_type(traits_type::eof(),
+ _Strbuf->sbumpc()))
+ _Strbuf = 0, _Got = true;
+ else
+ _Got = false;
+ }
+
+ _Elem _Peek()
+ {
+ int_type _Meta;
+ if (_Strbuf == 0
+ || traits_type::eq_int_type(traits_type::eof(),
+ _Meta = _Strbuf->sgetc()))
+ _Strbuf = 0;
+ else
+ _Val = traits_type::to_char_type(_Meta);
+ _Got = true;
+ return (_Val);
+ }
+
+ streambuf_type *_Strbuf;
+ bool _Got;
+ _Elem _Val;
+ };
+
+
+template<class _Elem,
+ class _Traits> inline
+ bool __cdecl operator==(
+ const istreambuf_iterator<_Elem, _Traits>& _Left,
+ const istreambuf_iterator<_Elem, _Traits>& _Right)
+ {
+ return (_Left.equal(_Right));
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ bool __cdecl operator!=(
+ const istreambuf_iterator<_Elem, _Traits>& _Left,
+ const istreambuf_iterator<_Elem, _Traits>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+
+template<class _Elem,
+ class _Traits>
+ class ostreambuf_iterator
+ : public _Outit_with_base<_Iterator_base_secure>
+ {
+ typedef ostreambuf_iterator<_Elem, _Traits> _Myt;
+public:
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_Elem, _Traits> streambuf_type;
+ typedef basic_ostream<_Elem, _Traits> ostream_type;
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+ ostreambuf_iterator(streambuf_type *_Sb) throw ()
+ : _Failed(false), _Strbuf(_Sb)
+ {
+ }
+
+ ostreambuf_iterator(ostream_type& _Ostr) throw ()
+ : _Failed(false), _Strbuf(_Ostr.rdbuf())
+ {
+ }
+
+ _Myt& operator=(_Elem _Right)
+ {
+ if (_Strbuf == 0
+ || traits_type::eq_int_type(_Traits::eof(),
+ _Strbuf->sputc(_Right)))
+ _Failed = true;
+ return (*this);
+ }
+
+ _Myt& operator*()
+ {
+ return (*this);
+ }
+
+ _Myt& operator++()
+ {
+ return (*this);
+ }
+
+ _Myt& operator++(int)
+ {
+ return (*this);
+ }
+
+ bool failed() const throw ()
+ {
+ return (_Failed);
+ }
+
+private:
+ bool _Failed;
+ streambuf_type *_Strbuf;
+ };
+
+
+
+
+template<class _InIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt __cdecl _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _InOutItCat, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ for (; _First != _Last; ++_Dest, ++_First)
+ *_Dest = *_First;
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt>
+inline
+ _OutIt __cdecl _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ random_access_iterator_tag, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Copy_opt(_First, _Last, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Nonscalar_ptr_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+template<class _InIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt __cdecl _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _InOutItCat, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+
+ ptrdiff_t _Off = _Last - _First;
+
+ _OutIt _Result = _Dest + _Off;
+ if (_Off > 0)
+ ::memmove_s((&*_Dest), (_Off * sizeof (*_First)), (&*_First), (_Off * sizeof (*_First)));
+ return _Result;
+ }
+
+template <bool _Cond, class _Result_type>
+struct _Enable_if;
+
+template <class _Result_type>
+struct _Enable_if<true, _Result_type>
+{
+ typedef _Result_type _Result;
+};
+
+template <class _Checked_iter_cat>
+struct _Is_checked_iterator_helper
+{
+ enum { _Result = false };
+};
+
+template <>
+struct _Is_checked_iterator_helper<_Range_checked_iterator_tag>
+{
+ enum { _Result = true };
+};
+
+template <class _Iter>
+struct _Is_checked_iterator
+{
+ enum { _Result =
+ _Is_checked_iterator_helper<typename _Checked_iterator_category<_Iter>::_Checked_cat>::_Result };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_Copy_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* __cdecl copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), ::stdext:: make_checked_array_iterator(_Dest, _Size)).base();
+ }
+
+template<class _InIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_Copy_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt, class _OutIt, class _InOutItCat, class _MoveCatTy>
+inline
+ _OutIt __cdecl _Move_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _InOutItCat _First_dest_cat, _MoveCatTy, _Range_checked_iterator_tag)
+ {
+ return _Copy_opt(_First, _Last, _Dest,
+ _First_dest_cat, _Ptr_cat(_First, _Dest), _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt __cdecl _Move_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _InOutItCat, _Swap_move_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ for (; _First != _Last; ++_Dest, ++_First)
+ ::std:: swap(*_Dest, *_First);
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt __cdecl _Move_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ random_access_iterator_tag, _Swap_move_tag _Move_cat, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Move_opt(_First, _Last, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Move_cat, _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+
+
+template<class _InIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl _Move(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return _Move_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* __cdecl _Move(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return _Move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last),
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base();
+ }
+
+template<class _InIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl _Move(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return _Move_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt1, class _BidIt2, class _InOutItCat>
+inline
+ _BidIt2 __cdecl _Copy_backward_opt(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest,
+ _InOutItCat, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ while (_First != _Last)
+ *--_Dest = *--_Last;
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt>
+inline
+ _OutIt __cdecl _Copy_backward_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ random_access_iterator_tag, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest - (_Last - _First);
+ _Copy_backward_opt(_First, _Last, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Nonscalar_ptr_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+template<class _InIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt __cdecl _Copy_backward_opt(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _InOutItCat, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+
+ ptrdiff_t _Off = _Last - _First;
+
+
+
+ _OutIt _Result = _Dest - _Off;
+ if (_Off > 0)
+ ::memmove_s((&*_Result), (_Off * sizeof (*_First)), (&*_First), (_Off * sizeof (*_First)));
+ return _Result;
+ }
+
+
+
+template<class _BidIt1,
+ class _BidIt2> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return _Copy_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1,
+ class _BidIt2> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return _Copy_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt1, class _BidIt2, class _InOutItCat, class _MoveCatTy>
+inline
+ _BidIt2 __cdecl _Move_backward_opt(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest,
+ _InOutItCat _First_dest_cat, _MoveCatTy, _Range_checked_iterator_tag)
+ {
+ return _Copy_backward_opt(_First, _Last, _Dest,
+ _First_dest_cat, _Ptr_cat(_First, _Dest), _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _InOutItCat>
+inline
+ _BidIt2 __cdecl _Move_backward_opt(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest,
+ _InOutItCat, _Swap_move_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ while (_First != _Last)
+ ::std:: swap(*--_Dest, *--_Last);
+ return (_Dest);
+ }
+
+
+template<class _BidIt1, class _BidIt2>
+inline
+ _BidIt2 __cdecl _Move_backward_opt(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest,
+ random_access_iterator_tag, _Swap_move_tag _Move_cat, _Range_checked_iterator_tag)
+ {
+
+ _BidIt2 _Result = _Dest - (_Last - _First);
+ _Move_backward_opt(_First, _Last, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Move_cat, _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+
+
+template<class _BidIt1, class _BidIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl _Move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return _Move_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl _Move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return _Move_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Iter_random(_First, _Dest), _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _InItCats>
+inline
+ pair<_InIt1, _InIt2>
+ __cdecl _Mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _InItCats, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+
+ for (; _First1 != _Last1 && *_First1 == *_First2; )
+ ++_First1, ++_First2;
+ return (pair<_InIt1, _InIt2>(_First1, _First2));
+ }
+
+
+template<class _InIt1, class _InIt2>
+inline
+ pair<_InIt1, _InIt2>
+ __cdecl _Mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ pair<_InIt1, typename ::std:: _Checked_iterator_base_helper<_InIt2>::_Checked_iterator_base_type> _Result =
+ _Mismatch(_First1, _Last1, ::std:: _Checked_base(_First2),
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First2, _Result.second);
+ return (pair<_InIt1, _InIt2>(_Result.first, _First2));
+ }
+
+
+
+
+template<class _InIt1, class _InIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InElem2, size_t _Size>
+inline
+pair<_InIt1, _InElem2*>
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size])
+ {
+ pair<_InIt1, ::stdext:: checked_array_iterator<_InElem2*> > _Result =
+ mismatch(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size));
+ return (pair<_InIt1, _InElem2*>(_Result.first, _Result.second.base()));
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _Pr, class _InItCats>
+inline
+ pair<_InIt1, _InIt2>
+ __cdecl _Mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred,
+ _InItCats, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+
+
+ for (; _First1 != _Last1 && _Pred(*_First1, *_First2); )
+ ++_First1, ++_First2;
+ return (pair<_InIt1, _InIt2>(_First1, _First2));
+ }
+
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+ pair<_InIt1, _InIt2>
+ __cdecl _Mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ pair<_InIt1, typename ::std:: _Checked_iterator_base_helper<_InIt2>::_Checked_iterator_base_type> _Result =
+ _Mismatch(_First1, _Last1, ::std:: _Checked_base(_First2), _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First2, _Result.second);
+ return (pair<_InIt1, _InIt2>(_Result.first, _First2));
+ }
+
+
+
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InElem2, class _Pr, size_t _Size>
+inline
+pair<_InIt1, _InElem2*>
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Pr _Pred)
+ {
+ pair<_InIt1, ::stdext:: checked_array_iterator<_InElem2*> > _Result =
+ mismatch(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size), _Pred);
+ return (pair<_InIt1, _InElem2*>(_Result.first, _Result.second.base()));
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _InItCats>
+inline
+ bool __cdecl _Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _InItCats, _Range_checked_iterator_tag)
+ {
+ return (_Mismatch(_First1, _Last1, _First2,
+ forward_iterator_tag(), _Range_checked_iterator_tag()).first == _Last1);
+ }
+
+inline bool __cdecl _Equal(const char *_First1,
+ const char *_Last1, const char *_First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ return (::memcmp(_First1, _First2, _Last1 - _First1) == 0);
+ }
+
+inline bool __cdecl _Equal(const signed char *_First1,
+ const signed char *_Last1, const signed char *_First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ return (::memcmp(_First1, _First2, _Last1 - _First1) == 0);
+ }
+
+inline bool __cdecl _Equal(const unsigned char *_First1,
+ const unsigned char *_Last1, const unsigned char *_First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ return (::memcmp(_First1, _First2, _Last1 - _First1) == 0);
+ }
+
+
+template<class _InIt1, class _InIt2>
+inline
+ bool __cdecl _Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ return _Equal(_First1, _Last1, ::std:: _Checked_base(_First2),
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ }
+
+
+
+
+template<class _InIt1, class _InIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ return _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, size_t _Size>
+inline
+bool __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size])
+ {
+ return equal(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _Size));
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ return _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _Pr, class _InItCats>
+inline
+ bool __cdecl _Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred,
+ _InItCats, _Range_checked_iterator_tag)
+ {
+ return (_Mismatch(_First1, _Last1, _First2, _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag()).first == _Last1);
+ }
+
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+ bool __cdecl _Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ return _Equal(_First1, _Last1, ::std:: _Checked_base(_First2), _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ }
+
+
+
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ return _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, class _Pr, size_t _Size>
+inline
+bool __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Pr _Pred)
+ {
+ return equal(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _Size), _Pred);
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ return _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt, class _Ty> inline
+ void __cdecl _Fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Val;
+ }
+
+inline void __cdecl _Fill( char *_First,
+ char *_Last, int _Val)
+ {
+ ;
+ ::memset(_First, _Val, _Last - _First);
+ }
+
+inline void __cdecl _Fill( signed char *_First,
+ signed char *_Last, int _Val)
+ {
+ ;
+ ::memset(_First, _Val, _Last - _First);
+ }
+
+inline void __cdecl _Fill(
+ unsigned char *_First,
+ unsigned char *_Last, int _Val)
+ {
+ ;
+ ::memset(_First, _Val, _Last - _First);
+ }
+
+template<class _FwdIt, class _Ty> inline
+ void __cdecl fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ _Fill(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val);
+ }
+
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty> inline
+ void __cdecl _Fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val,
+ _Range_checked_iterator_tag)
+ {
+ for (; 0 < _Count; --_Count, ++_First)
+ *_First = _Val;
+ }
+
+inline void __cdecl _Fill_n( char *_First,
+ size_t _Count, int _Val, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ ::memset(_First, _Val, _Count);
+ }
+
+inline void __cdecl _Fill_n( signed char *_First,
+ size_t _Count, int _Val, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ ::memset(_First, _Val, _Count);
+ }
+
+inline void __cdecl _Fill_n( unsigned char *_First,
+ size_t _Count, int _Val, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ ::memset(_First, _Val, _Count);
+ }
+
+template<class _OutIt, class _Diff, class _Ty, class _OutCat>
+inline
+ void __cdecl _Fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val,
+ _OutCat, _Range_checked_iterator_tag)
+ {
+ _Fill_n(_First, _Count, _Val, _Range_checked_iterator_tag());
+ }
+
+
+template<class _OutIt, class _Diff, class _Ty>
+inline
+ void __cdecl _Fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Last = _First + _Count; (_Last);
+ _Fill_n(::std:: _Checked_base(_First), _Count, _Val,
+ _Range_checked_iterator_tag());
+ }
+
+
+
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result __cdecl fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val)
+ {
+ _Fill_n(_First, _Count, _Val, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutElem,
+ class _Diff,
+ class _Ty, size_t _Size>
+inline
+void __cdecl fill_n(_OutElem (&_First)[_Size], _Diff _Count, const _Ty& _Val)
+ {
+ fill_n(::stdext:: make_checked_array_iterator(_First, _Size), _Count, _Val);
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result __cdecl fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val)
+ {
+ _Fill_n(_First, _Count, _Val, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2> inline
+ bool __cdecl _Lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2)
+ {
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, ++_First2)
+ if (((*_First1) < (*_First2)))
+ return (true);
+ else if (*_First2 < *_First1)
+ return (false);
+ return (_First1 == _Last1 && _First2 != _Last2);
+ }
+
+template<class _InIt1, class _InIt2> inline
+ bool __cdecl lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2)
+ {
+ return _Lexicographical_compare(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2));
+ }
+
+inline bool __cdecl lexicographical_compare(
+ const unsigned char *_First1, const unsigned char *_Last1,
+ const unsigned char *_First2, const unsigned char *_Last2)
+ {
+ ;
+ ;
+ ptrdiff_t _Num1 = _Last1 - _First1;
+ ptrdiff_t _Num2 = _Last2 - _First2;
+ int _Ans = ::memcmp(_First1, _First2, _Num1 < _Num2 ? _Num1 : _Num2);
+ return (_Ans < 0 || _Ans == 0 && _Num1 < _Num2);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _Pr> inline
+ bool __cdecl _Lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _Pr _Pred)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, ++_First2)
+ if (_Pred(*_First1, *_First2))
+ return (true);
+ else if (_Pred(*_First2, *_First1))
+ return (false);
+ return (_First1 == _Last1 && _First2 != _Last2);
+ }
+
+template<class _InIt1, class _InIt2, class _Pr> inline
+ bool __cdecl lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _Pr _Pred)
+ {
+ return _Lexicographical_compare(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Ty> inline
+ const _Ty& (__cdecl max)(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (((_Left) < (_Right)) ? _Right : _Left);
+ }
+
+
+template<class _Ty,
+ class _Pr> inline
+ const _Ty& (__cdecl max)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred)
+ {
+ return (_Pred(_Left, _Right) ? _Right : _Left);
+ }
+
+
+template<class _Ty> inline
+ const _Ty& (__cdecl min)(const _Ty& _Left, const _Ty& _Right)
+ {
+ return (((_Right) < (_Left)) ? _Right : _Left);
+ }
+
+
+template<class _Ty,
+ class _Pr> inline
+ const _Ty& (__cdecl min)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred)
+ {
+ return (_Pred(_Right, _Left) ? _Right : _Left);
+ }
+
+
+
+
+}
+
+namespace stdext {
+
+
+template <class _Iterator>
+ class checked_array_iterator
+ : public ::std:: iterator<
+ typename ::std:: iterator_traits<_Iterator>::iterator_category,
+ typename ::std:: iterator_traits<_Iterator>::value_type,
+ typename ::std:: iterator_traits<_Iterator>::difference_type,
+ typename ::std:: iterator_traits<_Iterator>::pointer,
+ typename ::std:: iterator_traits<_Iterator>::reference>
+ {
+public:
+ typedef checked_array_iterator<_Iterator> _Myt;
+ typedef typename ::std:: iterator_traits<_Iterator>::difference_type difference_type;
+ typedef typename ::std:: iterator_traits<_Iterator>::pointer pointer;
+ typedef typename ::std:: iterator_traits<_Iterator>::reference reference;
+
+ typedef ::std:: _Range_checked_iterator_tag _Checked_iterator_category;
+ typedef _Iterator _Inner_type;
+
+ typedef _Iterator _Checked_iterator_base_type;
+
+ _Checked_iterator_base_type _Checked_iterator_base() const
+ {
+ return _Mycont + _Current;
+ }
+
+ void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
+ {
+ _Current = _Base - _Mycont;
+ }
+
+
+
+ checked_array_iterator():
+ _Size(0), _Current(0)
+ {
+ }
+
+ checked_array_iterator(_Iterator _Cont, size_t _S, size_t _Index = 0)
+ {
+ { if (!(_Index <= _S)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ _Mycont = _Cont;
+ _Size = _S;
+ _Current =_Index;
+ }
+
+ _Iterator base() const
+ {
+ return _Mycont + _Current;
+ }
+
+ size_t __Size() const
+ {
+ return _Size;
+ }
+
+ bool operator==(const _Myt& _Right) const
+ {
+ { if (!(_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current == _Right._Current;
+ }
+
+ bool operator!=(const _Myt& _Right) const
+ {
+ return !(*this == _Right);
+ }
+
+ bool operator<(const _Myt& _Right) const
+ {
+ { if (!(_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current < _Right._Current;
+ }
+
+ bool operator>(const _Myt& _Right) const
+ {
+ return _Right < *this;
+ }
+
+ bool operator<=(const _Myt& _Right) const
+ {
+ return !(_Right < *this);
+ }
+
+ bool operator>=(const _Myt& _Right) const
+ {
+ return !(*this < _Right);
+ }
+
+ reference operator*() const
+ {
+ { if (!(_Current < _Size)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return *(_Mycont + _Current);
+ }
+
+ pointer operator->() const
+ {
+ return (&**this);
+ }
+
+ checked_array_iterator& operator++()
+ {
+ { if (!(_Current < _Size)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ ++_Current;
+ return *this;
+ }
+
+ _Myt operator++(int)
+ {
+ checked_array_iterator _Tmp = *this;
+ ++*this;
+ return _Tmp;
+ }
+
+ _Myt& operator--()
+ {
+ { if (!(_Current > 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ --_Current;
+ return *this;
+ }
+
+ _Myt operator--(int)
+ {
+ checked_array_iterator _Tmp = *this;
+ --*this;
+ return _Tmp;
+ }
+
+
+
+ _Myt& operator+=(difference_type _Off)
+ {
+ { if (!(_Current + _Off <= _Size && _Current + _Off >= 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ _Current += _Off;
+ return *this;
+ }
+
+ _Myt operator+(difference_type _Off) const
+ {
+ checked_array_iterator _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ _Myt& operator-=(difference_type _Off)
+ {
+ return (*this += -_Off);
+ }
+
+ _Myt operator-(difference_type _Off) const
+ {
+ checked_array_iterator _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ difference_type operator-(const checked_array_iterator& _Right) const
+ {
+ { if (!(_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current - _Right._Current;
+ }
+
+ reference operator[](difference_type _Off) const
+ {
+ { if (!(_Current + _Off < _Size && _Current + _Off >= 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return *(_Mycont + _Current + _Off);
+ }
+
+protected:
+ void _Xran() const
+ {
+ throw ::std:: out_of_range("invalid checked_array_iterator<T> subscript");
+ }
+
+ void _Xinvarg() const
+ {
+ throw ::std:: invalid_argument("invalid checked_array_iterator<T> argument");
+ }
+
+ _Iterator _Mycont;
+ size_t _Current;
+ size_t _Size;
+ };
+
+template <class _Iter>
+checked_array_iterator<_Iter> make_checked_array_iterator(_Iter _Ptr, size_t _Size)
+{
+ return checked_array_iterator<_Iter>(_Ptr, _Size);
+}
+
+template<class _InIt,
+ class _OutIt> inline
+ _OutIt __cdecl unchecked_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (::std:: _Copy_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl checked_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (::std:: _Copy_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* __cdecl checked_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return checked_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), ::stdext:: make_checked_array_iterator(_Dest, _Size)).base();
+ }
+
+template<class _InIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl checked_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (::std:: _Copy_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _BidIt1,
+ class _BidIt2> inline
+ _BidIt2 __cdecl unchecked_copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return (::std:: _Copy_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _BidIt1,
+ class _BidIt2> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl checked_copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return ::std:: _Copy_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1,
+ class _BidIt2> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl checked_copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return ::std:: _Copy_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+ _OutIt __cdecl _Unchecked_move(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (::std:: _Move_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl _Checked_move(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Move_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* __cdecl _Checked_move(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return _Checked_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last),
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base();
+ }
+
+template<class _InIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result __cdecl _Checked_move(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Move_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1,
+ class _BidIt2> inline
+ _BidIt2 __cdecl _Unchecked_move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return (::std:: _Move_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _BidIt1, class _BidIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl _Checked_move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return ::std:: _Move_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt2 >::_Result, _BidIt2 >::_Result __cdecl _Checked_move_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest)
+ {
+ return ::std:: _Move_backward_opt(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty> inline
+ void __cdecl unchecked_fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val)
+ {
+ ::std:: _Fill_n(_First, _Count, _Val, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result __cdecl checked_fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val)
+ {
+ _Fill_n(_First, _Count, _Val, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutElem,
+ class _Diff,
+ class _Ty, size_t _Size>
+inline
+void __cdecl checked_fill_n(_OutElem (&_First)[_Size], _Diff _Count, const _Ty& _Val)
+ {
+ checked_fill_n(::stdext:: make_checked_array_iterator( _First, _Size), _Count, _Val);
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Ty>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result __cdecl checked_fill_n(_OutIt _First, _Diff _Count, const _Ty& _Val)
+ {
+ _Fill_n(_First, _Count, _Val, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+ ::std:: pair<_InIt1, _InIt2>
+ __cdecl unchecked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+
+
+
+
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InElem2, size_t _Size>
+inline
+::std:: pair<_InIt1, _InElem2*>
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size])
+ {
+ ::std:: pair<_InIt1, ::stdext:: checked_array_iterator<_InElem2*> > _Result =
+ checked_mismatch(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size));
+ return (::std:: pair<_InIt1, _InElem2*>(_Result.first, _Result.second.base()));
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+ ::std:: pair<_InIt1, _InIt2>
+ __cdecl unchecked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+
+
+
+
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InElem2, class _Pr, size_t _Size>
+inline
+::std:: pair<_InIt1, _InElem2*>
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Pr _Pred)
+ {
+ ::std:: pair<_InIt1, ::stdext:: checked_array_iterator<_InElem2*> > _Result =
+ checked_mismatch(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size), _Pred);
+ return (::std:: pair<_InIt1, _InElem2*>(_Result.first, _Result.second.base()));
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, ::std:: pair< _InIt1, _InIt2 > >::_Result
+ __cdecl checked_mismatch(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ ::std:: pair<typename ::std:: _Checked_iterator_base_helper<_InIt1>::_Checked_iterator_base_type, _InIt2> _Result =
+ ::std:: _Mismatch(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ ::std:: _Checked_assign_from_base(_First1, _Result.first);
+ return (::std:: pair<_InIt1, _InIt2>(_First1, _Result.second));
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+ bool __cdecl unchecked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, size_t _Size>
+inline
+bool __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size])
+ {
+ return checked_equal(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _Size));
+ }
+
+template<class _InIt1, class _InIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+ bool __cdecl unchecked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, class _Pr, size_t _Size>
+inline
+bool __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Pr _Pred)
+ {
+ return checked_equal(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _Size), _Pred);
+ }
+
+template<class _InIt1, class _InIt2, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, bool >::_Result __cdecl checked_equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred)
+ {
+ return ::std:: _Equal(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Pred,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C"
+ void __cdecl _invalid_parameter_noinfo(void);
+
+
+
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+template<class _Container>
+ class back_insert_iterator
+ : public _Outit
+ {
+public:
+ typedef _Container container_type;
+ typedef typename _Container::reference reference;
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+ explicit back_insert_iterator(_Container& _Cont)
+ : container(&_Cont)
+ {
+ }
+
+ back_insert_iterator<_Container>& operator=(
+ typename _Container::const_reference _Val)
+ {
+ container->push_back(_Val);
+ return (*this);
+ }
+
+ back_insert_iterator<_Container>& operator*()
+ {
+ return (*this);
+ }
+
+ back_insert_iterator<_Container>& operator++()
+ {
+ return (*this);
+ }
+
+ back_insert_iterator<_Container> operator++(int)
+ {
+ return (*this);
+ }
+
+protected:
+ _Container *container;
+ };
+
+
+template<class _Container> inline
+ back_insert_iterator<_Container> back_inserter(_Container& _Cont)
+ {
+ return (std::back_insert_iterator<_Container>(_Cont));
+ }
+
+
+template<class _Container>
+ class front_insert_iterator
+ : public _Outit
+ {
+public:
+ typedef _Container container_type;
+ typedef typename _Container::reference reference;
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+ explicit front_insert_iterator(_Container& _Cont)
+ : container(&_Cont)
+ {
+ }
+
+ front_insert_iterator<_Container>& operator=(
+ typename _Container::const_reference _Val)
+ {
+ container->push_front(_Val);
+ return (*this);
+ }
+
+ front_insert_iterator<_Container>& operator*()
+ {
+ return (*this);
+ }
+
+ front_insert_iterator<_Container>& operator++()
+ {
+ return (*this);
+ }
+
+ front_insert_iterator<_Container> operator++(int)
+ {
+ return (*this);
+ }
+
+protected:
+ _Container *container;
+ };
+
+
+template<class _Container> inline
+ front_insert_iterator<_Container> front_inserter(_Container& _Cont)
+ {
+ return (std::front_insert_iterator<_Container>(_Cont));
+ }
+
+
+template<class _Container>
+ class insert_iterator
+ : public _Outit
+ {
+public:
+ typedef _Container container_type;
+ typedef typename _Container::reference reference;
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+ insert_iterator(_Container& _Cont, typename _Container::iterator _Where)
+ : container(&_Cont), iter(_Where)
+ {
+ }
+
+ insert_iterator<_Container>& operator=(
+ typename _Container::const_reference _Val)
+ {
+ iter = container->insert(iter, _Val);
+ ++iter;
+ return (*this);
+ }
+
+ insert_iterator<_Container>& operator*()
+ {
+ return (*this);
+ }
+
+ insert_iterator<_Container>& operator++()
+ {
+ return (*this);
+ }
+
+ insert_iterator<_Container>& operator++(int)
+ {
+ return (*this);
+ }
+
+protected:
+ _Container *container;
+ typename _Container::iterator iter;
+ };
+
+
+template<class _Container,
+ class _Iter> inline
+ insert_iterator<_Container> inserter(_Container& _Cont, _Iter _Where)
+ {
+ return (std::insert_iterator<_Container>(_Cont, _Where));
+ }
+
+
+template<class _Ty,
+ class _Elem = char,
+ class _Traits = char_traits<_Elem>,
+ class _Diff = ptrdiff_t>
+ class istream_iterator
+ : public iterator<input_iterator_tag, _Ty, _Diff,
+ const _Ty *, const _Ty&>
+ {
+ typedef istream_iterator<_Ty, _Elem, _Traits, _Diff> _Myt;
+public:
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef basic_istream<_Elem, _Traits> istream_type;
+
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+
+ istream_iterator()
+ : _Myistr(0)
+ {
+ }
+
+ istream_iterator(istream_type& _Istr)
+ : _Myistr(&_Istr)
+ {
+ _Getval();
+ }
+
+ const _Ty& operator*() const
+ {
+
+
+
+
+
+
+
+
+ { if (!(_Myistr != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+
+
+ return (_Myval);
+ }
+
+ const _Ty *operator->() const
+ {
+ return (&**this);
+ }
+
+ _Myt& operator++()
+ {
+
+
+
+
+
+
+
+
+ { if (!(_Myistr != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+
+
+ _Getval();
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ bool _Equal(const _Myt& _Right) const
+ {
+ return (_Myistr == _Right._Myistr);
+ }
+
+protected:
+ void _Getval()
+ {
+ if (_Myistr != 0 && !(*_Myistr >> _Myval))
+ _Myistr = 0;
+ }
+
+ static void _Xran()
+ {
+ throw out_of_range("invalid istream_iterator");
+ }
+
+ istream_type *_Myistr;
+ _Ty _Myval;
+ };
+
+
+template<class _Ty,
+ class _Elem,
+ class _Traits,
+ class _Diff> inline
+ bool operator==(
+ const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
+ const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
+ {
+ return (_Left._Equal(_Right));
+ }
+
+template<class _Ty,
+ class _Elem,
+ class _Traits,
+ class _Diff> inline
+ bool operator!=(
+ const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
+ const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+
+template<class _Ty,
+ class _Elem = char,
+ class _Traits = char_traits<_Elem> >
+ class ostream_iterator
+ : public _Outit
+ {
+public:
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef basic_ostream<_Elem, _Traits> ostream_type;
+
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+
+ ostream_iterator(ostream_type& _Ostr,
+ const _Elem *_Delim = 0)
+ : _Myostr(&_Ostr), _Mydelim(_Delim)
+ {
+ }
+
+ ostream_iterator<_Ty, _Elem, _Traits>& operator=(const _Ty& _Val)
+ {
+ *_Myostr << _Val;
+ if (_Mydelim != 0)
+ *_Myostr << _Mydelim;
+
+
+
+
+
+
+
+
+ { if (!(*_Myostr != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+
+
+ return (*this);
+ }
+
+ ostream_iterator<_Ty, _Elem, _Traits>& operator*()
+ {
+ return (*this);
+ }
+
+ ostream_iterator<_Ty, _Elem, _Traits>& operator++()
+ {
+ return (*this);
+ }
+
+ ostream_iterator<_Ty, _Elem, _Traits> operator++(int)
+ {
+ return (*this);
+ }
+
+protected:
+ static void _Xran()
+ {
+ throw out_of_range("invalid ostream_iterator");
+ }
+
+ const _Elem *_Mydelim;
+ ostream_type *_Myostr;
+ };
+
+}
+
+namespace stdext {
+
+
+template <class _Cont, class _Iter = typename _Cont::iterator>
+ class checked_iterator
+ : public ::std:: iterator<
+ typename ::std:: iterator_traits<_Iter>::iterator_category,
+ typename ::std:: iterator_traits<_Iter>::value_type,
+ typename ::std:: iterator_traits<_Iter>::difference_type,
+ typename ::std:: iterator_traits<_Iter>::pointer,
+ typename ::std:: iterator_traits<_Iter>::reference>
+ {
+ friend class checked_iterator;
+public:
+ typedef checked_iterator<_Cont, _Iter> _Myt;
+ typedef typename ::std:: iterator_traits<_Iter>::difference_type difference_type;
+ typedef typename ::std:: iterator_traits<_Iter>::pointer pointer;
+ typedef typename ::std:: iterator_traits<_Iter>::reference reference;
+
+ typedef ::std:: _Range_checked_iterator_tag _Checked_iterator_category;
+ typedef _Iter _Inner_type;
+
+ typedef _Iter _Checked_iterator_base_type;
+
+ _Checked_iterator_base_type _Checked_iterator_base() const
+ {
+ return _Current;
+ }
+
+ void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
+ {
+ _Current = _Base;
+ }
+
+
+
+ checked_iterator()
+ : _Mycont(0)
+ {
+ }
+
+ checked_iterator(_Cont& _C, _Iter _Ptr)
+ : _Mycont(&_C), _Current(_Ptr)
+ {
+ }
+
+ checked_iterator(const _Myt &_Right)
+ : _Mycont(_Right._Mycont), _Current(_Right._Current)
+ {
+ }
+
+ template <class Iter2>
+ checked_iterator(const checked_iterator<_Cont, Iter2> &_Right)
+ : _Mycont(_Right._Mycont), _Current(_Right._Current)
+ {
+ }
+
+ _Iter base() const
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current;
+ }
+
+ template <class Iter2>
+ bool operator==(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ { if (!(_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current == _Right._Current;
+ }
+
+ template <class Iter2>
+ bool operator!=(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return !(*this == _Right);
+ }
+
+ template <class Iter2>
+ bool operator<(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ { if (!(_Mycont != 0 && _Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current < _Right._Current;
+ }
+
+ template <class Iter2>
+ bool operator>(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ return _Right < *this;
+ }
+
+ template <class Iter2>
+ bool operator<=(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ return !(_Right < *this);
+ }
+
+ template <class Iter2>
+ bool operator>=(const checked_iterator<_Cont, Iter2>& _Right) const
+ {
+ return !(*this < _Right);
+ }
+
+ reference operator*() const
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Current != _Mycont->end())) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return *_Current;
+ }
+
+ pointer operator->() const
+ {
+ return (&**this);
+ }
+
+ _Myt& operator++()
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Current != _Mycont->end())) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ ++_Current;
+ return *this;
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ ++*this;
+ return _Tmp;
+ }
+
+ _Myt& operator--()
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Current != _Mycont->begin())) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ --_Current;
+ return *this;
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ --*this;
+ return _Tmp;
+ }
+
+
+
+ _Myt& operator+=(difference_type _Off)
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!((_Mycont->end() - _Current) >= _Off && (_Mycont->begin() - _Current) <= _Off)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ _Current += _Off;
+ return *this;
+ }
+
+ _Myt operator+(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ _Myt& operator-=(difference_type _Off)
+ {
+ return (*this += -_Off);
+ }
+
+ _Myt operator-(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ difference_type operator-(const _Myt& _Right) const
+ {
+ { if (!(_Mycont != 0 && _Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current - _Right._Current;
+ }
+
+ reference operator[](difference_type _Off) const
+ {
+ { if (!(_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!((_Mycont->end() - _Current) > _Off && (_Mycont->begin() - _Current) <= _Off)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ return _Current[_Off];
+ }
+
+protected:
+ void _Xran() const
+ {
+ throw ::std:: out_of_range("invalid checked_iterator<T> subscript");
+ }
+
+ void _Xinvarg() const
+ {
+ throw ::std:: invalid_argument("invalid checked_iterator<T> argument");
+ }
+
+ _Cont *_Mycont;
+ _Iter _Current;
+ };
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef int (__cdecl * _onexit_t)(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef struct _div_t {
+ int quot;
+ int rem;
+} div_t;
+
+typedef struct _ldiv_t {
+ long quot;
+ long rem;
+} ldiv_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(4)
+typedef struct {
+ unsigned char ld[10];
+} _LDOUBLE;
+#pragma pack()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef struct {
+ double x;
+} _CRT_DOUBLE;
+
+typedef struct {
+ float f;
+} _CRT_FLOAT;
+
+
+
+
+
+typedef struct {
+
+
+
+ long double x;
+} _LONGDOUBLE;
+
+
+
+#pragma pack(4)
+typedef struct {
+ unsigned char ld12[12];
+} _LDBL12;
+#pragma pack()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern int __mb_cur_max;
+
+
+
+
+ int __cdecl ___mb_cur_max_func(void);
+ int __cdecl ___mb_cur_max_l_func(_locale_t);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef void (__cdecl *_purecall_handler)(void);
+
+
+ _purecall_handler __cdecl _set_purecall_handler( _purecall_handler _Handler);
+ _purecall_handler __cdecl _get_purecall_handler();
+
+
+
+extern "C++"
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t);
+
+
+ _invalid_parameter_handler __cdecl _set_invalid_parameter_handler( _invalid_parameter_handler _Handler);
+ _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
+
+
+
+extern "C++"
+{
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+ unsigned long * __cdecl __doserrno(void);
+
+
+errno_t __cdecl _set_doserrno( unsigned long _Value);
+errno_t __cdecl _get_doserrno( unsigned long * _Value);
+
+
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char ** __cdecl __sys_errlist(void);
+
+
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int * __cdecl __sys_nerr(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern int __argc;
+ extern char ** __argv;
+ extern wchar_t ** __wargv;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern char ** _environ;
+ extern wchar_t ** _wenviron;
+
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_pgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) extern char * _pgmptr;
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_wpgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) extern wchar_t * _wpgmptr;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+errno_t __cdecl _get_pgmptr( char ** _Value);
+errno_t __cdecl _get_wpgmptr( wchar_t ** _Value);
+
+
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_fmode" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) extern int _fmode;
+
+
+
+
+
+ errno_t __cdecl _set_fmode( int _Mode);
+ errno_t __cdecl _get_fmode( int * _PMode);
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4141)
+
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osplatform" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) extern unsigned int _osplatform;
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) extern unsigned int _osver;
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) extern unsigned int _winver;
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winmajor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) extern unsigned int _winmajor;
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winminor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) extern unsigned int _winminor;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(pop)
+
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osplatform( unsigned int * _Value);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osver( unsigned int * _Value);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winver( unsigned int * _Value);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winmajor( unsigned int * _Value);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winminor( unsigned int * _Value);
+
+
+
+
+
+
+extern "C++"
+{
+template <typename _CountofType, size_t _SizeOfArray>
+char (*__countof_helper( _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
+
+}
+
+
+
+
+
+
+
+ __declspec(noreturn) void __cdecl exit( int _Code);
+ __declspec(noreturn) void __cdecl _exit( int _Code);
+ void __cdecl abort(void);
+
+
+ unsigned int __cdecl _set_abort_behavior( unsigned int _Flags, unsigned int _Mask);
+
+
+
+ int __cdecl abs( int _X);
+ long __cdecl labs( long _X);
+
+
+
+ __int64 __cdecl _abs64(__int64);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl atexit(void (__cdecl *)(void));
+
+
+
+ double __cdecl atof( const char *_String);
+ double __cdecl _atof_l( const char *_String, _locale_t _Locale);
+
+ int __cdecl atoi( const char *_Str);
+ int __cdecl _atoi_l( const char *_Str, _locale_t _Locale);
+ long __cdecl atol( const char *_Str);
+ long __cdecl _atol_l( const char *_Str, _locale_t _Locale);
+
+
+
+ void * __cdecl bsearch_s( const void * _Key, const void * _Base,
+ rsize_t _NumOfElements, rsize_t _SizeOfElements,
+ int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void * _Context);
+
+ void * __cdecl bsearch( const void * _Key, const void * _Base,
+ size_t _NumOfElements, size_t _SizeOfElements,
+ int (__cdecl * _PtFuncCompare)(const void *, const void *));
+
+
+ void __cdecl qsort_s( void * _Base,
+ rsize_t _NumOfElements, rsize_t _SizeOfElements,
+ int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void *_Context);
+
+ void __cdecl qsort( void * _Base,
+ size_t _NumOfElements, size_t _SizeOfElements,
+ int (__cdecl * _PtFuncCompare)(const void *, const void *));
+
+ unsigned short __cdecl _byteswap_ushort( unsigned short _Short);
+ unsigned long __cdecl _byteswap_ulong ( unsigned long _Long);
+
+ unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
+
+ div_t __cdecl div( int _Numerator, int _Denominator);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_dupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl getenv( const char * _VarName);
+
+ errno_t __cdecl getenv_s( size_t * _ReturnSize, char * _DstBuf, rsize_t _DstSize, const char * _VarName);
+
+extern "C++" { template <size_t _Size> inline errno_t __cdecl getenv_s( size_t * _ReturnSize, char (&_Dest)[_Size], const char * _VarName) { return getenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
+
+
+
+
+
+ errno_t __cdecl _dupenv_s( char **_PBuffer, size_t * _PBufferSizeInBytes, const char * _VarName);
+
+
+
+
+
+ errno_t __cdecl _itoa_s( int _Value, char * _DstBuf, size_t _Size, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _itoa_s( int _Value, char (&_Dest)[_Size], int _Radix) { return _itoa_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _itoa( int _Value, char *_Dest, int _Radix);
+
+ errno_t __cdecl _i64toa_s( __int64 _Val, char * _DstBuf, size_t _Size, int _Radix);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _i64toa( __int64 _Val, char * _DstBuf, int _Radix);
+ errno_t __cdecl _ui64toa_s( unsigned __int64 _Val, char * _DstBuf, size_t _Size, int _Radix);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ui64toa( unsigned __int64 _Val, char * _DstBuf, int _Radix);
+ __int64 __cdecl _atoi64( const char * _String);
+ __int64 __cdecl _atoi64_l( const char * _String, _locale_t _Locale);
+ __int64 __cdecl _strtoi64( const char * _String, char ** _EndPtr, int _Radix);
+ __int64 __cdecl _strtoi64_l( const char * _String, char ** _EndPtr, int _Radix, _locale_t _Locale);
+ unsigned __int64 __cdecl _strtoui64( const char * _String, char ** _EndPtr, int _Radix);
+ unsigned __int64 __cdecl _strtoui64_l( const char * _String, char ** _EndPtr, int _Radix, _locale_t _Locale);
+
+ ldiv_t __cdecl ldiv( long _Numerator, long _Denominator);
+
+extern "C++"
+{
+ inline ldiv_t div( long _A1, long _A2)
+ {
+ return ldiv(_A1, _A2);
+ }
+}
+
+ errno_t __cdecl _ltoa_s( long _Val, char * _DstBuf, size_t _Size, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltoa_s( long _Value, char (&_Dest)[_Size], int _Radix) { return _ltoa_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ltoa( long _Value, char *_Dest, int _Radix);
+ int __cdecl mblen( const char * _Ch, size_t _MaxCount);
+ int __cdecl _mblen_l( const char * _Ch, size_t _MaxCount, _locale_t _Locale);
+ size_t __cdecl _mbstrlen( const char * _Str);
+ size_t __cdecl _mbstrlen_l( const char *_Str, _locale_t _Locale);
+ size_t __cdecl _mbstrnlen( const char *_Str, size_t _MaxCount);
+ size_t __cdecl _mbstrnlen_l( const char *_Str, size_t _MaxCount, _locale_t _Locale);
+ int __cdecl mbtowc( wchar_t * _DstCh, const char * _SrcCh, size_t _SrcSizeInBytes);
+ int __cdecl _mbtowc_l( wchar_t * _DstCh, const char * _SrcCh, size_t _SrcSizeInBytes, _locale_t _Locale);
+ errno_t __cdecl mbstowcs_s( size_t * _PtNumOfCharConverted, wchar_t * _DstBuf, size_t _SizeInWords, const char * _SrcBuf, size_t _MaxCount );
+extern "C++" { template <size_t _Size> inline errno_t __cdecl mbstowcs_s( size_t * _PtNumOfCharConverted, wchar_t (&_Dest)[_Size], const char * _Source, size_t _MaxCount) { return mbstowcs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbstowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl mbstowcs( wchar_t *_Dest, const char * _Source, size_t _MaxCount);
+
+ errno_t __cdecl _mbstowcs_s_l( size_t * _PtNumOfCharConverted, wchar_t * _DstBuf, size_t _SizeInWords, const char * _SrcBuf, size_t _MaxCount, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbstowcs_s_l( size_t * _PtNumOfCharConverted, wchar_t (&_Dest)[_Size], const char * _Source, size_t _MaxCount, _locale_t _Locale) { return _mbstowcs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstowcs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl _mbstowcs_l( wchar_t *_Dest, const char * _Source, size_t _MaxCount, _locale_t _Locale);
+
+ int __cdecl rand(void);
+
+
+
+
+ int __cdecl _set_error_mode( int _Mode);
+
+ void __cdecl srand( unsigned int _Seed);
+ double __cdecl strtod( const char * _Str, char ** _EndPtr);
+ double __cdecl _strtod_l( const char * _Str, char ** _EndPtr, _locale_t _Locale);
+ long __cdecl strtol( const char * _Str, char ** _EndPtr, int _Radix );
+ long __cdecl _strtol_l( const char *_Str, char **_EndPtr, int _Radix, _locale_t _Locale);
+ unsigned long __cdecl strtoul( const char * _Str, char ** _EndPtr, int _Radix);
+ unsigned long __cdecl _strtoul_l(const char * _Str, char **_EndPtr, int _Radix, _locale_t _Locale);
+
+
+ int __cdecl system( const char * _Command);
+
+ errno_t __cdecl _ultoa_s( unsigned long _Val, char * _DstBuf, size_t _Size, int _Radix);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultoa_s( unsigned long _Value, char (&_Dest)[_Size], int _Radix) { return _ultoa_s(_Value, _Dest, _Size, _Radix); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ultoa( unsigned long _Value, char *_Dest, int _Radix);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "wctomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl wctomb( char * _MbCh, wchar_t _WCh);
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctomb_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int __cdecl _wctomb_l( char * _MbCh, wchar_t _WCh, _locale_t _Locale);
+
+ errno_t __cdecl wctomb_s( int * _SizeConverted, char * _MbCh, rsize_t _SizeInBytes, wchar_t _WCh);
+
+ errno_t __cdecl _wctomb_s_l( int * _SizeConverted, char * _MbCh, size_t _SizeInBytes, wchar_t _WCh, _locale_t _Locale);
+ errno_t __cdecl wcstombs_s( size_t * _PtNumOfCharConverted, char * _Dst, size_t _DstSizeInBytes, const wchar_t * _Src, size_t _MaxCountInBytes);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl wcstombs_s( size_t * _PtNumOfCharConverted, char (&_Dest)[_Size], const wchar_t * _Source, size_t _MaxCount) { return wcstombs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl wcstombs( char *_Dest, const wchar_t * _Source, size_t _MaxCount);
+ errno_t __cdecl _wcstombs_s_l( size_t * _PtNumOfCharConverted, char * _Dst, size_t _DstSizeInBytes, const wchar_t * _Src, size_t _MaxCountInBytes, _locale_t _Locale);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcstombs_s_l( size_t * _PtNumOfCharConverted, char (&_Dest)[_Size], const wchar_t * _Source, size_t _MaxCount, _locale_t _Locale) { return _wcstombs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstombs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) size_t __cdecl _wcstombs_l( char *_Dest, const wchar_t * _Source, size_t _MaxCount, _locale_t _Locale);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ char * __cdecl _fullpath( char * _FullPath, const char * _Path, size_t _SizeInBytes);
+
+
+
+
+
+
+
+ errno_t __cdecl _ecvt_s( char * _DstBuf, size_t _Size, double _Val, int _NumOfDights, int * _PtDec, int * _PtSign);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _ecvt_s( char (&_Dest)[_Size], double _Value, int _NumOfDigits, int * _PtDec, int * _PtSign) { return _ecvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ecvt( double _Val, int _NumOfDigits, int * _PtDec, int * _PtSign);
+ errno_t __cdecl _fcvt_s( char * _DstBuf, size_t _Size, double _Val, int _NumOfDec, int * _PtDec, int * _PtSign);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _fcvt_s( char (&_Dest)[_Size], double _Value, int _NumOfDigits, int * _PtDec, int * _PtSign) { return _fcvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _fcvt( double _Val, int _NumOfDec, int * _PtDec, int * _PtSign);
+ errno_t __cdecl _gcvt_s( char * _DstBuf, size_t _Size, double _Val, int _NumOfDigits);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _gcvt_s( char (&_Dest)[_Size], double _Value, int _NumOfDigits) { return _gcvt_s(_Dest, _Size, _Value, _NumOfDigits); } }
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_gcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _gcvt( double _Val, int _NumOfDigits, char * _DstBuf);
+
+ int __cdecl _atodbl( _CRT_DOUBLE * _Result, char * _Str);
+ int __cdecl _atoldbl( _LDOUBLE * _Result, char * _Str);
+ int __cdecl _atoflt( _CRT_FLOAT * _Result, char * _Str);
+ int __cdecl _atodbl_l( _CRT_DOUBLE * _Result, char * _Str, _locale_t _Locale);
+ int __cdecl _atoldbl_l( _LDOUBLE * _Result, char * _Str, _locale_t _Locale);
+ int __cdecl _atoflt_l( _CRT_FLOAT * _Result, char * _Str, _locale_t _Locale);
+ unsigned long __cdecl _lrotl( unsigned long _Val, int _Shift);
+ unsigned long __cdecl _lrotr( unsigned long _Val, int _Shift);
+ errno_t __cdecl _makepath_s( char * _PathResult, size_t _Size, const char * _Drive, const char * _Dir, const char * _Filename,
+ const char * _Ext);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _makepath_s( char (&_Path)[_Size], const char * _Drive, const char * _Dir, const char * _Filename, const char * _Ext) { return _makepath_s(_Path, _Size, _Drive, _Dir, _Filename, _Ext); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_makepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _makepath( char *_Path, const char * _Drive, const char * _Dir, const char * _Filename, const char * _Ext);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _onexit_t __cdecl _onexit( _onexit_t _Func);
+
+
+
+
+
+
+ int __cdecl _putenv( const char * _EnvString);
+ errno_t __cdecl _putenv_s( const char * _Name, const char * _Value);
+ unsigned int __cdecl _rotl( unsigned int _Val, int _Shift);
+
+ unsigned __int64 __cdecl _rotl64( unsigned __int64 _Val, int _Shift);
+
+ unsigned int __cdecl _rotr( unsigned int _Val, int _Shift);
+
+ unsigned __int64 __cdecl _rotr64( unsigned __int64 _Val, int _Shift);
+
+ errno_t __cdecl _searchenv_s( const char * _Filename, const char * _EnvVar, char * _ResultPath, size_t _SizeInBytes);
+extern "C++" { template <size_t _Size> inline errno_t __cdecl _searchenv_s( const char * _Filename, const char * _EnvVar, char (&_ResultPath)[_Size]) { return _searchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_searchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _searchenv( const char * _Filename, const char * _EnvVar, char *_ResultPath);
+
+__declspec(deprecated("This function or variable may be unsafe. Consider using " "_splitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _splitpath( const char * _FullPath, char * _Drive, char * _Dir, char * _Filename, char * _Ext);
+ errno_t __cdecl _splitpath_s( const char * _FullPath,
+ char * _Drive, size_t _DriveSize,
+ char * _Dir, size_t _DirSize,
+ char * _Filename, size_t _FilenameSize,
+ char * _Ext, size_t _ExtSize);
+extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _splitpath_s( const char *_Dest, char (&_Drive)[_DriveSize], char (&_Dir)[_DirSize], char (&_Name)[_NameSize], char (&_Ext)[_ExtSize]) { return _splitpath_s(_Dest, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
+
+ void __cdecl _swab( char * _Buf1, char * _Buf2, int _SizeInBytes);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "SetErrorMode" " instead. See online help for details.")) void __cdecl _seterrormode( int _Mode);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Beep" " instead. See online help for details.")) void __cdecl _beep( unsigned _Frequency, unsigned _Duration);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Sleep" " instead. See online help for details.")) void __cdecl _sleep( unsigned long _Duration);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable: 4141)
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ecvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl ecvt( double _Val, int _NumOfDigits, int * _PtDec, int * _PtSign);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl fcvt( double _Val, int _NumOfDec, int * _PtDec, int * _PtSign);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_gcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl gcvt( double _Val, int _NumOfDigits, char * _DstBuf);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_itoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl itoa( int _Val, char * _DstBuf, int _Radix);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ltoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl ltoa( long _Val, char * _DstBuf, int _Radix);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putenv" ". See online help for details.")) int __cdecl putenv( const char * _EnvString);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_swab" ". See online help for details.")) void __cdecl swab( char * _Buf1, char * _Buf2, int _SizeInBytes);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ultoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl ultoa( unsigned long _Val, char * _Dstbuf, int _Radix);
+#pragma warning(pop)
+_onexit_t __cdecl onexit( _onexit_t _Func);
+
+
+
+
+
+
+}
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+namespace std {
+using ::size_t; using ::div_t; using ::ldiv_t;
+
+using ::abort; using ::abs; using ::atexit;
+using ::atof; using ::atoi; using ::atol;
+using ::bsearch; using ::calloc; using ::div;
+using ::exit; using ::free; using ::getenv;
+using ::labs; using ::ldiv; using ::malloc;
+using ::mblen; using ::mbstowcs; using ::mbtowc;
+using ::qsort; using ::rand; using ::realloc;
+using ::srand; using ::strtod; using ::strtol;
+using ::strtoul; using ::system;
+using ::wcstombs; using ::wctomb;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+
+
+
+
+
+
+
+typedef void (__cdecl * new_handler) ();
+
+
+
+
+struct nothrow_t
+ {
+ };
+
+extern const nothrow_t nothrow;
+
+
+
+ new_handler __cdecl set_new_handler(new_handler)
+ throw ();
+}
+
+
+void __cdecl operator delete(void *) throw ();
+ void *__cdecl operator new(size_t _Size) throw (...);
+
+
+
+inline void *__cdecl operator new(size_t, void *_Where) throw ()
+ {
+ return (_Where);
+ }
+
+inline void __cdecl operator delete(void *, void *) throw ()
+ {
+ }
+
+
+
+
+inline void *__cdecl operator new[](size_t, void *_Where) throw ()
+ {
+ return (_Where);
+ }
+
+inline void __cdecl operator delete[](void *, void *) throw ()
+ {
+ }
+
+
+void __cdecl operator delete[](void *) throw ();
+
+ void *__cdecl operator new[](size_t _Size)
+ throw (...);
+
+
+
+ void *__cdecl operator new(size_t _Size, const std::nothrow_t&)
+ throw ();
+
+ void *__cdecl operator new[](size_t _Size, const std::nothrow_t&)
+ throw ();
+
+void __cdecl operator delete(void *, const std::nothrow_t&)
+ throw ();
+
+void __cdecl operator delete[](void *, const std::nothrow_t&)
+ throw ();
+
+
+
+
+
+using std::new_handler;
+
+
+
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+ #pragma warning(disable: 4100)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+
+template<class _Ty> inline
+ _Ty *_Allocate(size_t _Count, _Ty *)
+ {
+ if (_Count <= 0)
+ _Count = 0;
+ else if (((size_t)(-1) / _Count) < sizeof (_Ty))
+ throw std::bad_alloc(0);
+
+
+ return ((_Ty *)::operator new(_Count * sizeof (_Ty)));
+ }
+
+
+template<class _T1,
+ class _T2> inline
+ void _Construct(_T1 *_Ptr, const _T2& _Val)
+ {
+ void *_Vptr = _Ptr;
+ ::new (_Vptr) _T1(_Val);
+ }
+
+
+template<class _Ty> inline
+ void _Destroy(_Ty *_Ptr)
+ {
+ (_Ptr)->~_Ty();
+ }
+
+template<> inline
+ void _Destroy(char *)
+ {
+ }
+
+template<> inline
+ void _Destroy(wchar_t *)
+ {
+ }
+
+
+
+template<class _Ty>
+ struct _Allocator_base
+ {
+ typedef _Ty value_type;
+ };
+
+
+template<class _Ty>
+ struct _Allocator_base<const _Ty>
+ {
+ typedef _Ty value_type;
+ };
+
+
+template<class _Ty>
+ class allocator
+ : public _Allocator_base<_Ty>
+ {
+public:
+ typedef _Allocator_base<_Ty> _Mybase;
+ typedef typename _Mybase::value_type value_type;
+ typedef value_type *pointer;
+ typedef value_type & reference;
+ typedef const value_type *const_pointer;
+ typedef const value_type & const_reference;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ template<class _Other>
+ struct rebind
+ {
+ typedef allocator<_Other> other;
+ };
+
+ pointer address(reference _Val) const
+ {
+ return (&_Val);
+ }
+
+ const_pointer address(const_reference _Val) const
+ {
+ return (&_Val);
+ }
+
+ allocator() throw ()
+ {
+ }
+
+ allocator(const allocator<_Ty>&) throw ()
+ {
+ }
+
+ template<class _Other>
+ allocator(const allocator<_Other>&) throw ()
+ {
+ }
+
+ template<class _Other>
+ allocator<_Ty>& operator=(const allocator<_Other>&)
+ {
+ return (*this);
+ }
+
+ void deallocate(pointer _Ptr, size_type)
+ {
+ ::operator delete(_Ptr);
+ }
+
+ pointer allocate(size_type _Count)
+ {
+ return (_Allocate(_Count, (pointer)0));
+ }
+
+ pointer allocate(size_type _Count, const void *)
+ {
+ return (allocate(_Count));
+ }
+
+ void construct(pointer _Ptr, const _Ty& _Val)
+ {
+ _Construct(_Ptr, _Val);
+ }
+
+ void destroy(pointer _Ptr)
+ {
+ _Destroy(_Ptr);
+ }
+
+ size_t max_size() const throw ()
+ {
+ size_t _Count = (size_t)(-1) / sizeof (_Ty);
+ return (0 < _Count ? _Count : 1);
+ }
+ };
+
+
+template<class _Ty,
+ class _Other> inline
+ bool operator==(const allocator<_Ty>&, const allocator<_Other>&) throw ()
+ {
+ return (true);
+ }
+
+template<class _Ty,
+ class _Other> inline
+ bool operator!=(const allocator<_Ty>&, const allocator<_Other>&) throw ()
+ {
+ return (false);
+ }
+
+
+template<> class allocator<void>
+ {
+public:
+ typedef void _Ty;
+ typedef _Ty *pointer;
+ typedef const _Ty *const_pointer;
+ typedef _Ty value_type;
+
+ template<class _Other>
+ struct rebind
+ {
+ typedef allocator<_Other> other;
+ };
+
+ allocator() throw ()
+ {
+ }
+
+ allocator(const allocator<_Ty>&) throw ()
+ {
+ }
+
+ template<class _Other>
+ allocator(const allocator<_Other>&) throw ()
+ {
+ }
+
+ template<class _Other>
+ allocator<_Ty>& operator=(const allocator<_Other>&)
+ {
+ return (*this);
+ }
+ };
+
+
+template<class _Ty,
+ class _Alloc> inline
+ void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al)
+ {
+ _Destroy_range(_First, _Last, _Al, _Ptr_cat(_First, _Last));
+ }
+
+template<class _Ty,
+ class _Alloc> inline
+ void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al,
+ _Nonscalar_ptr_iterator_tag)
+ {
+ for (; _First != _Last; ++_First)
+ _Al.destroy(_First);
+ }
+
+template<class _Ty,
+ class _Alloc> inline
+ void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al,
+ _Scalar_ptr_iterator_tag)
+ {
+ }
+}
+
+
+ #pragma warning(default: 4100)
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+template<class _Ty> inline
+ pair<_Ty *, ptrdiff_t>
+ get_temporary_buffer(ptrdiff_t _Count)
+ {
+ _Ty *_Pbuf;
+
+ if (_Count <= 0)
+ _Count = 0;
+ else if (((size_t)(-1) / _Count) < sizeof (_Ty))
+ throw std::bad_alloc(0);
+
+ for (_Pbuf = 0; 0 < _Count; _Count /= 2)
+ if ((_Pbuf = (_Ty *)operator new(
+ (size_t)_Count * sizeof (_Ty), nothrow)) != 0)
+ break;
+
+ return (pair<_Ty *, ptrdiff_t>(_Pbuf, _Count));
+ }
+
+
+template<class _Ty> inline
+ void return_temporary_buffer(_Ty *_Pbuf)
+ {
+ operator delete(_Pbuf);
+ }
+
+
+template<class _InIt,
+ class _FwdIt> inline
+ _FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt _Next = _Dest;
+
+ try {
+ for (; _First != _Last; ++_Dest, ++_First)
+ _Construct(&*_Dest, *_First);
+ } catch (...) {
+ for (; _Next != _Dest; ++_Next)
+ _Destroy(&*_Next);
+ throw;
+ }
+ return (_Dest);
+ }
+
+template<class _Ty1,
+ class _Ty2> inline
+ _Ty2 _Uninit_copy(_Ty1 _First, _Ty1 _Last, _Ty2 _Dest,
+ _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ size_t _Count = (size_t)(_Last - _First);
+ _Ty2 _Result = _Dest + _Count;
+ if (_Count > 0)
+ ::memmove_s((&*_Dest), (_Count * sizeof (*_First)), (&*_First), (_Count * sizeof (*_First)));
+ return _Result;
+ }
+
+
+
+template<class _InIt,
+ class _FwdIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest)
+ {
+ return (_Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, size_t _Size>
+inline
+_FwdElem* uninitialized_copy(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size])
+ {
+ return (uninitialized_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt,
+ class _FwdIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest)
+ {
+ return (_Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+ _FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt _Next = _Dest;
+
+ try {
+ for (; _First != _Last; ++_Dest, ++_First)
+ _Al.construct(_Dest, *_First);
+ } catch (...) {
+ for (; _Next != _Dest; ++_Next)
+ _Al.destroy(_Next);
+ throw;
+ }
+ return (_Dest);
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+ _FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc&, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ size_t _Count = (size_t)(_Last - _First);
+ _FwdIt _Result = _Dest + _Count;
+ if (_Count > 0)
+ ::memmove_s((&*_Dest), (_Count * sizeof (*_First)), (&*_First), (_Count * sizeof (*_First)));
+ return _Result;
+ }
+
+
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (_Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, class _Alloc, size_t _Size>
+inline
+_FwdElem* _Uninitialized_copy(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size],
+ _Alloc& _Al)
+ {
+ return (_Uninitialized_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Al).base());
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (_Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt, class _FwdIt, class _Alloc, class _MoveCatTy>
+inline
+ _FwdIt _Uninit_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al, _MoveCatTy, _Range_checked_iterator_tag)
+ {
+ return ::stdext:: unchecked_uninitialized_copy(_First, _Last, _Dest, _Al);
+ }
+
+template<class _InIt, class _FwdIt, class _Alloc>
+inline
+ _FwdIt _Uninit_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al, _Swap_move_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt _Next = _Dest;
+
+ typename _Alloc::value_type _Val;
+
+ try {
+ for (; _First != _Last; ++_Dest, ++_First)
+ {
+ _Al.construct(_Dest, _Val);
+ ::std:: swap(*_Dest, *_First);
+ }
+ } catch (...) {
+ for (; _Next != _Dest; ++_Next)
+ _Al.destroy(_Next);
+ throw;
+ }
+ return (_Dest);
+ }
+
+
+
+template<class _InIt, class _FwdIt, class _Alloc>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (_Uninit_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, class _Alloc, size_t _Size>
+inline
+_FwdElem* _Uninitialized_move(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size],
+ _Alloc& _Al)
+ {
+ return (_Uninitialized_move(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Al).base());
+ }
+
+template<class _InIt, class _FwdIt, class _Alloc>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (_Uninit_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Tval> inline
+ void _Uninit_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val,
+ _Nonscalar_ptr_iterator_tag)
+ {
+ ;
+ _FwdIt _Next = _First;
+
+ try {
+ for (; _First != _Last; ++_First)
+ _Construct(&*_First, _Val);
+ } catch (...) {
+ for (; _Next != _First; ++_Next)
+ _Destroy(&*_Next);
+ throw;
+ }
+ }
+
+template<class _Ty,
+ class _Tval> inline
+ void _Uninit_fill(_Ty *_First, _Ty *_Last, const _Tval& _Val,
+ _Scalar_ptr_iterator_tag)
+ {
+ std::fill(_First, _Last, _Val);
+ }
+
+template<class _FwdIt,
+ class _Tval> inline
+ void uninitialized_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val)
+ {
+ _Uninit_fill(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val, _Ptr_cat(_First, _First));
+ }
+
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+ void _Uninit_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val,
+ _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ _FwdIt _Next = _First;
+
+ try {
+ for (; 0 < _Count; --_Count, ++_First)
+ _Construct(&*_First, _Val);
+ } catch (...) {
+ for (; _Next != _First; ++_Next)
+ _Destroy(&*_Next);
+ throw;
+ }
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+ void _Uninit_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val,
+ _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ::stdext:: unchecked_fill_n(&*_First, _Count, _Val);
+ }
+
+
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result uninitialized_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val)
+ {
+ _Uninit_fill_n(_First, _Count, _Val, _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdElem, class _Diff, class _Tval, size_t _Size>
+inline
+void uninitialized_fill_n(_FwdElem (&_First)[_Size], _Diff _Count, const _Tval& _Val)
+ {
+ uninitialized_fill_n(::stdext:: make_checked_array_iterator(_First, _Size), _Count, _Val);
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result uninitialized_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val)
+ {
+ _Uninit_fill_n(_First, _Count, _Val, _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+ void _Uninit_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+
+
+
+
+
+ _FwdIt _Next = _First;
+
+ try {
+ for (; 0 < _Count; --_Count, ++_First)
+ _Al.construct(_First, _Val);
+ } catch (...) {
+ for (; _Next != _First; ++_Next)
+ _Al.destroy(_Next);
+ throw;
+ }
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+ void _Uninit_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc&, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ::stdext:: unchecked_fill_n(_First, _Count, _Val);
+ }
+
+
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result _Uninitialized_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ _Uninit_fill_n(_First, _Count, _Val, _Al,
+ _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdElem, class _Diff, class _Tval, class _Alloc, size_t _Size>
+inline
+void _Uninitialized_fill_n(_FwdElem (&_First)[_Size], _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ _Uninitialized_fill_n(::stdext:: make_checked_array_iterator(_First, _Size), _Count, _Val, _Al);
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result _Uninitialized_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ _Uninit_fill_n(_First, _Count, _Val, _Al,
+ _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Ty>
+ class raw_storage_iterator
+ : public _Outit
+ {
+public:
+ typedef _FwdIt iterator_type;
+ typedef _FwdIt iter_type;
+ typedef _Ty element_type;
+
+ explicit raw_storage_iterator(_FwdIt _First)
+ : _Next(_First)
+ {
+ }
+
+ raw_storage_iterator<_FwdIt, _Ty>& operator*()
+ {
+ return (*this);
+ }
+
+ raw_storage_iterator<_FwdIt, _Ty>& operator=(const _Ty& _Val)
+ {
+ _Construct(&*_Next, _Val);
+ return (*this);
+ }
+
+ raw_storage_iterator<_FwdIt, _Ty>& operator++()
+ {
+ ++_Next;
+ return (*this);
+ }
+
+ raw_storage_iterator<_FwdIt, _Ty> operator++(int)
+ {
+ raw_storage_iterator<_FwdIt, _Ty> _Ans = *this;
+ ++_Next;
+ return (_Ans);
+ }
+
+private:
+ _FwdIt _Next;
+ };
+
+
+template<class _Ty>
+ class _Temp_iterator
+ : public _Outit
+ {
+public:
+ typedef _Ty *_Pty;
+
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+
+ _Temp_iterator(ptrdiff_t _Count = 0)
+ {
+ _Buf._Begin = 0;
+ _Buf._Current = 0;
+ _Buf._Hiwater = 0;
+ _Buf._Size = _Count;
+ _Pbuf = &_Buf;
+ }
+
+ _Temp_iterator(const _Temp_iterator<_Ty>& _Right)
+ {
+ _Buf._Begin = 0;
+ _Buf._Current = 0;
+ _Buf._Hiwater = 0;
+ _Buf._Size = 0;
+ *this = _Right;
+ }
+
+ ~_Temp_iterator()
+ {
+ if (_Buf._Begin != 0)
+ {
+ for (_Pty _Next = _Buf._Begin;
+ _Next != _Buf._Hiwater; ++_Next)
+ _Destroy(&*_Next);
+ std::return_temporary_buffer(_Buf._Begin);
+ }
+ }
+
+ _Temp_iterator<_Ty>& operator=(const _Temp_iterator<_Ty>& _Right)
+ {
+ _Pbuf = _Right._Pbuf;
+ return (*this);
+ }
+
+ _Temp_iterator<_Ty>& operator=(const _Ty& _Val)
+ {
+ if (_Pbuf->_Current < _Pbuf->_Hiwater)
+ *_Pbuf->_Current++ = _Val;
+ else
+ {
+ { if (!((_Pbuf->_Current - _Pbuf->_Begin) < _Pbuf->_Size)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ _Pty _Ptr = &*_Pbuf->_Current;
+ _Construct(_Ptr, _Val);
+ _Pbuf->_Hiwater = ++_Pbuf->_Current;
+ }
+ return (*this);
+ }
+
+ _Temp_iterator<_Ty>& operator*()
+ {
+ return (*this);
+ }
+
+ _Temp_iterator<_Ty>& operator++()
+ {
+ return (*this);
+ }
+
+ _Temp_iterator<_Ty>& operator++(int)
+ {
+ return (*this);
+ }
+
+ _Temp_iterator<_Ty>& _Init()
+ {
+ _Pbuf->_Current = _Pbuf->_Begin;
+ return (*this);
+ }
+
+ _Pty _First() const
+ {
+ return (_Pbuf->_Begin);
+ }
+
+ _Pty _Last() const
+ {
+ return (_Pbuf->_Current);
+ }
+
+ ptrdiff_t _Maxlen()
+ {
+ if (_Pbuf->_Begin == 0 && 0 < _Pbuf->_Size)
+ {
+ pair<_Pty, ptrdiff_t> _Pair =
+ std::get_temporary_buffer<_Ty>(_Pbuf->_Size);
+
+ _Pbuf->_Begin = _Pair.first;
+ _Pbuf->_Current = _Pair.first;
+ _Pbuf->_Hiwater = _Pair.first;
+ _Pbuf->_Size = _Pair.second;
+ }
+ return (_Pbuf->_Size);
+ }
+
+ static void _Xinvarg()
+ {
+ throw invalid_argument("invalid _Temp_iterator<T> argument");
+ }
+
+private:
+ struct _Bufpar
+ {
+ _Pty _Begin;
+ _Pty _Current;
+ _Pty _Hiwater;
+ ptrdiff_t _Size;
+ };
+ _Bufpar _Buf;
+ _Bufpar *_Pbuf;
+ };
+
+
+template<class _Ty>
+ class auto_ptr;
+
+template<class _Ty>
+ struct auto_ptr_ref
+ {
+ auto_ptr_ref(void *_Right)
+ : _Ref(_Right)
+ {
+ }
+
+ void *_Ref;
+ };
+
+template<class _Ty>
+ class auto_ptr
+ {
+public:
+ typedef _Ty element_type;
+
+ explicit auto_ptr(_Ty *_Ptr = 0) throw ()
+ : _Myptr(_Ptr)
+ {
+ }
+
+ auto_ptr(auto_ptr<_Ty>& _Right) throw ()
+ : _Myptr(_Right.release())
+ {
+ }
+
+ auto_ptr(auto_ptr_ref<_Ty> _Right) throw ()
+ {
+ _Ty **_Pptr = (_Ty **)_Right._Ref;
+ _Ty *_Ptr = *_Pptr;
+ *_Pptr = 0;
+ _Myptr = _Ptr;
+ }
+
+ template<class _Other>
+ operator auto_ptr<_Other>() throw ()
+ {
+ return (auto_ptr<_Other>(*this));
+ }
+
+ template<class _Other>
+ operator auto_ptr_ref<_Other>() throw ()
+ {
+ _Other *_Testptr = (_Ty *)_Myptr;
+ auto_ptr_ref<_Other> _Ans(&_Myptr);
+ return (_Testptr != 0 ? _Ans : _Ans);
+ }
+
+ template<class _Other>
+ auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) throw ()
+ {
+ reset(_Right.release());
+ return (*this);
+ }
+
+ template<class _Other>
+ auto_ptr(auto_ptr<_Other>& _Right) throw ()
+ : _Myptr(_Right.release())
+ {
+ }
+
+ auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) throw ()
+ {
+ reset(_Right.release());
+ return (*this);
+ }
+
+ auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) throw ()
+ {
+ _Ty **_Pptr = (_Ty **)_Right._Ref;
+ _Ty *_Ptr = *_Pptr;
+ *_Pptr = 0;
+ reset(_Ptr);
+ return (*this);
+ }
+
+ ~auto_ptr()
+ {
+ delete (_Ty *)_Myptr;
+ }
+
+ _Ty& operator*() const throw ()
+ {
+
+
+
+
+
+
+ ;
+
+ return (*(_Ty *)_Myptr);
+ }
+
+ _Ty *operator->() const throw ()
+ {
+ return (&**this);
+ }
+
+ _Ty *get() const throw ()
+ {
+ return ((_Ty *)_Myptr);
+ }
+
+ _Ty *release() throw ()
+ {
+ _Ty *_Tmp = (_Ty *)_Myptr;
+ _Myptr = 0;
+ return (_Tmp);
+ }
+
+ void reset(_Ty* _Ptr = 0)
+ {
+ if (_Ptr != _Myptr)
+ delete (_Ty *)_Myptr;
+ _Myptr = _Ptr;
+ }
+
+private:
+ const _Ty *_Myptr;
+ };
+}
+
+namespace stdext {
+
+template<class _InIt,
+ class _FwdIt> inline
+ _FwdIt unchecked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _FwdIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, size_t _Size>
+inline
+_FwdElem* checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size])
+ {
+ return (checked_uninitialized_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt,
+ class _FwdIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+ _FwdIt unchecked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, class _Alloc, size_t _Size>
+inline
+_FwdElem* checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size],
+ _Alloc& _Al)
+ {
+ return (checked_uninitialized_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Al).base());
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result checked_uninitialized_copy(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Ptr_cat(_First, _Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _FwdIt,
+ class _Alloc> inline
+ _FwdIt _Unchecked_uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdIt, class _Alloc>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Checked_uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _FwdElem, class _Alloc, size_t _Size>
+inline
+_FwdElem* _Checked_uninitialized_move(_InIt _First, _InIt _Last, _FwdElem (&_Dest)[_Size],
+ _Alloc& _Al)
+ {
+ return (_Checked_uninitialized_move(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Al).base());
+ }
+
+template<class _InIt, class _FwdIt, class _Alloc>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, _FwdIt >::_Result _Checked_uninitialized_move(_InIt _First, _InIt _Last, _FwdIt _Dest,
+ _Alloc& _Al)
+ {
+ return (::std:: _Uninit_move(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Al,
+ ::std:: _Move_cat(_Dest), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+ void unchecked_uninitialized_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result checked_uninitialized_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdElem, class _Diff, class _Tval, size_t _Size>
+inline
+void checked_uninitialized_fill_n(_FwdElem (&_First)[_Size], _Diff _Count, const _Tval& _Val)
+ {
+ checked_uninitialized_fill_n(::stdext:: make_checked_array_iterator(_First, _Size), _Count, _Val);
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result checked_uninitialized_fill_n(_FwdIt _First, _Diff _Count, const _Tval& _Val)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+ void unchecked_uninitialized_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, _Al,
+ ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result checked_uninitialized_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, _Al,
+ ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdElem, class _Diff, class _Tval, class _Alloc, size_t _Size>
+inline
+void checked_uninitialized_fill_n(_FwdElem (&_First)[_Size], _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ checked_uninitialized_fill_n(::stdext:: make_checked_array_iterator(_First, _Size), _Count, _Val, _Al);
+ }
+
+template<class _FwdIt,
+ class _Diff,
+ class _Tval,
+ class _Alloc> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt >::_Result, void >::_Result checked_uninitialized_fill_n(_FwdIt _First, _Diff _Count,
+ const _Tval& _Val, _Alloc& _Al)
+ {
+ ::std:: _Uninit_fill_n(_First, _Count, _Val, _Al,
+ ::std:: _Ptr_cat(_First, _First), ::std:: _Range_checked_iterator_tag());
+ }
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+ #pragma warning(disable: 4244)
+
+
+namespace std {
+
+
+const int _ISORT_MAX = 32;
+
+
+template<class _InIt,
+ class _Fn1> inline
+ _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
+ {
+ ;
+ ;
+ typename ::std:: _Checked_iterator_base_helper<_InIt>::_Checked_iterator_base_type _ChkFirst(::std:: _Checked_base(_First));
+ typename ::std:: _Checked_iterator_base_helper<_InIt>::_Checked_iterator_base_type _ChkLast(::std:: _Checked_base(_Last));
+ for (; _ChkFirst != _ChkLast; ++_ChkFirst)
+ _Func(*_ChkFirst);
+ return (_Func);
+ }
+
+
+template<class _InIt, class _Ty>
+inline
+ _InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val)
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ if (*_First == _Val)
+ break;
+ return (_First);
+ }
+
+inline const char *_Find(const char *_First, const char *_Last, int _Val)
+ {
+ ;
+ _First = (const char *)::memchr(_First, _Val, _Last - _First);
+ return (_First == 0 ? _Last : _First);
+ }
+
+inline const signed char *_Find(const signed char *_First,
+ const signed char *_Last, int _Val)
+ {
+ ;
+ _First = (const signed char *)::memchr(_First, _Val,
+ _Last - _First);
+ return (_First == 0 ? _Last : _First);
+ }
+
+inline const unsigned char *_Find(const unsigned char *_First,
+ const unsigned char *_Last, int _Val)
+ {
+ ;
+ _First = (const unsigned char *)::memchr(_First, _Val,
+ _Last - _First);
+ return (_First == 0 ? _Last : _First);
+ }
+
+template<class _InIt, class _Ty>
+inline
+ _InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Find(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val));
+ return (_First);
+ }
+
+
+template<class _InIt,
+ class _Pr> inline
+ _InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First)
+ if (_Pred(*_First))
+ break;
+ return (_First);
+ }
+
+template<class _InIt,
+ class _Pr> inline
+ _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Find_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_First);
+ }
+
+
+template<class _FwdIt> inline
+ _FwdIt _Adjacent_find(_FwdIt _First, _FwdIt _Last)
+ {
+ ;
+ for (_FwdIt _Firstb; (_Firstb = _First) != _Last && ++_First != _Last; )
+ if (*_Firstb == *_First)
+ return (_Firstb);
+ return (_Last);
+ }
+
+template<class _FwdIt> inline
+ _FwdIt adjacent_find(_FwdIt _First, _FwdIt _Last)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Adjacent_find(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last)));
+ return (_First);
+ }
+
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt _Adjacent_find(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ for (_FwdIt _Firstb; (_Firstb = _First) != _Last && ++_First != _Last; )
+ if (_Pred(*_Firstb, *_First))
+ return (_Firstb);
+ return (_Last);
+ }
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt adjacent_find(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Adjacent_find(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_First);
+ }
+
+
+template<class _InIt,
+ class _Ty> inline
+ typename iterator_traits<_InIt>::difference_type
+ _Count(_InIt _First, _InIt _Last, const _Ty& _Val)
+ {
+ ;
+ typename iterator_traits<_InIt>::difference_type _Cnt = 0;
+
+ for (; _First != _Last; ++_First)
+ if (*_First == _Val)
+ ++_Cnt;
+ return (_Cnt);
+ }
+
+template<class _InIt,
+ class _Ty> inline
+ typename iterator_traits<_InIt>::difference_type
+ count(_InIt _First, _InIt _Last, const _Ty& _Val)
+ {
+ return _Count(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val);
+ }
+
+
+template<class _InIt,
+ class _Pr> inline
+ typename iterator_traits<_InIt>::difference_type
+ _Count_if(_InIt _First, _InIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ typename iterator_traits<_InIt>::difference_type _Count = 0;
+
+ for (; _First != _Last; ++_First)
+ if (_Pred(*_First))
+ ++_Count;
+ return (_Count);
+ }
+
+template<class _InIt,
+ class _Pr> inline
+ typename iterator_traits<_InIt>::difference_type
+ count_if(_InIt _First, _InIt _Last, _Pr _Pred)
+ {
+ return _Count_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred);
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Diff1,
+ class _Diff2> inline
+ _FwdIt1 _Search(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Diff1 *, _Diff2 *)
+ {
+ ;
+ ;
+ _Diff1 _Count1 = 0;
+ _Distance(_First1, _Last1, _Count1);
+ _Diff2 _Count2 = 0;
+ _Distance(_First2, _Last2, _Count2);
+
+ for (; _Count2 <= _Count1; ++_First1, --_Count1)
+ {
+ _FwdIt1 _Mid1 = _First1;
+ for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1, ++_Mid2)
+ if (_Mid2 == _Last2)
+ return (_First1);
+ else if (!(*_Mid1 == *_Mid2))
+ break;
+ }
+ return (_Last1);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2> inline
+ _FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Search(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dist_type(_First1), _Dist_type(_First2)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Diff1,
+ class _Diff2,
+ class _Pr> inline
+ _FwdIt1 _Search(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred, _Diff1 *, _Diff2 *)
+ {
+ ;
+ ;
+ ;
+ _Diff1 _Count1 = 0;
+ _Distance(_First1, _Last1, _Count1);
+ _Diff2 _Count2 = 0;
+ _Distance(_First2, _Last2, _Count2);
+
+ for (; _Count2 <= _Count1; ++_First1, --_Count1)
+ {
+ _FwdIt1 _Mid1 = _First1;
+ for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1, ++_Mid2)
+ if (_Mid2 == _Last2)
+ return (_First1);
+ else if (!_Pred(*_Mid1, *_Mid2))
+ break;
+ }
+ return (_Last1);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Pr> inline
+ _FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Search(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred, _Dist_type(_First1), _Dist_type(_First2)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty> inline
+ _FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val, forward_iterator_tag)
+ {
+ ;
+ _FwdIt1 _Mid1;
+
+ if (_Count == 0)
+ return (_First1);
+
+ for (;; _First1 = ++_Mid1)
+ {
+ _Diff2 _Count1 = _Count;
+
+ for (; _First1 != _Last1; ++_First1)
+ if (*_First1 == _Val)
+ break;
+
+ for (_Mid1 = _First1;; )
+ if (--_Count1 == 0)
+ return (_First1);
+ else if (_Mid1 == _Last1 || !(*++_Mid1 == _Val))
+ break;
+ if (_Mid1 == _Last1)
+ return (_Last1);
+ }
+ }
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty> inline
+ _FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val, random_access_iterator_tag)
+ {
+ ;
+ _FwdIt1 _Mid1;
+
+ if (_Count == 0)
+ return (_First1);
+
+ for (;; _First1 = ++_Mid1)
+ {
+ _FwdIt1 _Oldfirst1 = _First1;
+ _Diff2 _Count1 = _Count;
+
+ for (;; _First1 += _Count)
+ if (_First1 == _Last1)
+ return (_Last1);
+ else if (*_First1 == _Val)
+ break;
+ else if (_Last1 - _First1 < _Count)
+ return (_Last1);
+
+ _Mid1 = _First1;
+ if (_Oldfirst1 != _First1)
+ for (++_Oldfirst1; _Oldfirst1 != _First1; --_First1, --_Count1)
+ if (!(_First1[-1] == _Val))
+ break;
+
+ for (;;)
+ if (--_Count1 == 0)
+ return (_First1);
+ else if (_Mid1 == _Last1 || !(*++_Mid1 == _Val))
+ break;
+ if (_Mid1 == _Last1)
+ return (_Last1);
+ }
+ }
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty> inline
+ _FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Search_n(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _Count, _Val, _Iter_cat(_First1)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty,
+ class _Pr> inline
+ _FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val, _Pr _Pred, forward_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt1 _Mid1;
+
+ if (_Count == 0)
+ return (_First1);
+
+ for (;; _First1 = ++_Mid1)
+ {
+ _Diff2 _Count1 = _Count;
+
+ for (; _First1 != _Last1; ++_First1)
+ if (_Pred(*_First1, _Val))
+ break;
+
+ for (_Mid1 = _First1;; )
+ if (--_Count1 == 0)
+ return (_First1);
+ else if (_Mid1 == _Last1 || !_Pred(*++_Mid1, _Val))
+ break;
+ if (_Mid1 == _Last1)
+ return (_Last1);
+ }
+ }
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty,
+ class _Pr> inline
+ _FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val, _Pr _Pred, random_access_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt1 _Mid1;
+
+ if (_Count == 0)
+ return (_First1);
+
+ for (;; _First1 = ++_Mid1)
+ {
+ _FwdIt1 _Oldfirst1 = _First1;
+ _Diff2 _Count1 = _Count;
+
+ for (;; _First1 += _Count)
+ if (_First1 == _Last1)
+ return (_Last1);
+ else if (_Pred(*_First1, _Val))
+ break;
+ else if (_Last1 - _First1 < _Count)
+ return (_Last1);
+
+ if (_Oldfirst1 != _First1)
+ for (++_Oldfirst1; _Oldfirst1 != _First1; --_First1, --_Count1)
+ if (!_Pred(_First1[-1], _Val))
+ break;
+
+ for (_Mid1 = _First1;; )
+ if (--_Count1 == 0)
+ return (_First1);
+ else if (_Mid1 == _Last1 || !_Pred(*++_Mid1, _Val))
+ break;
+ if (_Mid1 == _Last1)
+ return (_Last1);
+ }
+ }
+
+template<class _FwdIt1,
+ class _Diff2,
+ class _Ty,
+ class _Pr> inline
+ _FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _Diff2 _Count, const _Ty& _Val, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Search_n(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _Count, _Val, _Pred, _Iter_cat(_First1)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Diff1,
+ class _Diff2> inline
+ _FwdIt1 _Find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Diff1 *, _Diff2 *)
+ {
+ ;
+ ;
+ _Diff1 _Count1 = 0;
+ _Distance(_First1, _Last1, _Count1);
+ _Diff2 _Count2 = 0;
+ _Distance(_First2, _Last2, _Count2);
+ _FwdIt1 _Ans = _Last1;
+
+ if (0 < _Count2)
+ for (; _Count2 <= _Count1; ++_First1, --_Count1)
+ {
+ _FwdIt1 _Mid1 = _First1;
+ for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1)
+ if (!(*_Mid1 == *_Mid2))
+ break;
+ else if (++_Mid2 == _Last2)
+ {
+ _Ans = _First1;
+ break;
+ }
+ }
+ return (_Ans);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2> inline
+ _FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Find_end(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dist_type(_First1), _Dist_type(_First2)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Diff1,
+ class _Diff2,
+ class _Pr> inline
+ _FwdIt1 _Find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred, _Diff1 *, _Diff2 *)
+ {
+ ;
+ ;
+ ;
+ _Diff1 _Count1 = 0;
+ _Distance(_First1, _Last1, _Count1);
+ _Diff2 _Count2 = 0;
+ _Distance(_First2, _Last2, _Count2);
+ _FwdIt1 _Ans = _Last1;
+
+ if (0 < _Count2)
+ for (; _Count2 <= _Count1; ++_First1, --_Count1)
+ {
+ _FwdIt1 _Mid1 = _First1;
+ for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1)
+ if (!_Pred(*_Mid1, *_Mid2))
+ break;
+ else if (++_Mid2 == _Last2)
+ {
+ _Ans = _First1;
+ break;
+ }
+ }
+ return (_Ans);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Pr> inline
+ _FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Find_end(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred, _Dist_type(_First1), _Dist_type(_First2)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2> inline
+ _FwdIt1 _Find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2)
+ {
+ ;
+ ;
+ for (; _First1 != _Last1; ++_First1)
+ for (_FwdIt2 _Mid2 = _First2; _Mid2 != _Last2; ++_Mid2)
+ if (*_First1 == *_Mid2)
+ return (_First1);
+ return (_First1);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2> inline
+ _FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2)
+ {
+ ;
+ ;
+ ::std:: _Checked_assign_from_base(_First1, _Find_first_of(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2)));
+ return _First1;
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Pr> inline
+ _FwdIt1 _Find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
+ {
+ ;
+ for (; _First1 != _Last1; ++_First1)
+ for (_FwdIt2 _Mid2 = _First2; _Mid2 != _Last2; ++_Mid2)
+ if (_Pred(*_First1, *_Mid2))
+ return (_First1);
+ return (_First1);
+ }
+
+template<class _FwdIt1,
+ class _FwdIt2,
+ class _Pr> inline
+ _FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
+ _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First1, _Find_first_of(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred));
+ return (_First1);
+ }
+
+
+template<class _FwdIt1,
+ class _FwdIt2> inline
+ void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
+ {
+ std::swap(*_Left, *_Right);
+ }
+
+
+template<class _FwdIt1, class _FwdIt2, class _FwdItCats>
+inline
+ _FwdIt2 _Swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2,
+ _FwdItCats, _Range_checked_iterator_tag)
+ {
+ ;
+ for (; _First1 != _Last1; ++_First1, ++_First2)
+ std::iter_swap(_First1, _First2);
+ return (_First2);
+ }
+
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+ _FwdIt2 _Swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _FwdIt2 _Result = _First2 + (_Last1 - _First1);
+ _Swap_ranges(_First1, _Last1, ::std:: _Checked_base(_First2),
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return (_Result);
+ }
+
+
+
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt2 >::_Result, _FwdIt2 >::_Result swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)
+ {
+ return _Swap_ranges(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt1, class _FwdElem2, size_t _Size>
+inline
+_FwdElem2* swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdElem2 (&_First2)[_Size])
+ {
+ return (swap_ranges(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size)).base());
+ }
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt2 >::_Result, _FwdIt2 >::_Result swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)
+ {
+ return _Swap_ranges(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt, class _OutIt, class _Fn1, class _InOutItCat>
+inline
+ _OutIt _Transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func,
+ _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Func(*_First);
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+ _OutIt _Transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Transform(_First, _Last, ::std:: _Checked_base(_Dest), _Func,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return (_Result);
+ }
+
+
+
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
+ {
+ return _Transform(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Func,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Fn1, size_t _Size>
+inline
+_OutElem* transform(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Fn1 _Func)
+ {
+ return (transform(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Func).base());
+ }
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
+ {
+ return _Transform(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Func,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2, class _InItCats, class _InOutItCat>
+inline
+ _OutIt _Transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func,
+ _InItCats, _InOutItCat,
+ _Range_checked_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1; ++_First1, ++_First2, ++_Dest)
+ *_Dest = _Func(*_First1, *_First2);
+ return (_Dest);
+ }
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+ _OutIt _Transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func,
+ random_access_iterator_tag, random_access_iterator_tag,
+ _Range_checked_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ _OutIt _Result = _Dest + (_Last1 - _First1);
+ _Transform(_First1, _Last1, ::std:: _Checked_base(_First2),
+ ::std:: _Checked_base(_Dest), _Func,
+ forward_iterator_tag(), forward_iterator_tag(),
+ _Range_checked_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2, class _InOutItCat>
+inline
+ _OutIt _Transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func,
+ random_access_iterator_tag, _InOutItCat,
+ _Range_checked_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2);
+ return _Transform(_First1, _Last1, ::std:: _Checked_base(_First2),
+ _Dest, _Func,
+ forward_iterator_tag(), forward_iterator_tag(),
+ _Range_checked_iterator_tag(), _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2, class _InItCats>
+inline
+ _OutIt _Transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func,
+ _InItCats, random_access_iterator_tag,
+ _Range_checked_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last1 - _First1);
+ _Transform(_First1, _Last1, _First2,
+ ::std:: _Checked_base(_Dest), _Func,
+ forward_iterator_tag(), forward_iterator_tag(),
+ _Range_checked_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result && ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Dest, _Func,
+ _Iter_random(_First1, _First2), _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, class _OutElem, class _Fn2, size_t _SizeFirst2, size_t _SizeDest>
+inline
+_OutElem* transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (transform(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest),
+ _Func).base());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Fn2, size_t _SizeDest>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, _OutElem* >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (_Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest), _Func,
+ _Iter_random(_First1, _First2), _Iter_cat(_First1),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()).base());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Fn2, size_t _SizeDest>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, _OutElem* >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (_Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest), _Func,
+ _Iter_random(_First1, _First2), _Iter_cat(_First1),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()).base());
+ }
+
+template<class _InIt1, class _InElem2, class _OutIt, class _Fn2, size_t _SizeFirst2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return (_Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ _Dest, _Func,
+ _Iter_cat(_First1), _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt1, class _InElem2, class _OutIt, class _Fn2, size_t _SizeFirst2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return (_Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ _Dest, _Func,
+ _Iter_cat(_First1), _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result || !::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Dest, _Func,
+ _Iter_random(_First1, _First2), _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Ty> inline
+ void _Replace(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ if (*_First == _Oldval)
+ *_First = _Newval;
+ }
+
+template<class _FwdIt,
+ class _Ty> inline
+ void replace(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ _Replace(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Oldval, _Newval);
+ }
+
+
+template<class _FwdIt,
+ class _Pr,
+ class _Ty> inline
+ void _Replace_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred, const _Ty& _Val)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First)
+ if (_Pred(*_First))
+ *_First = _Val;
+ }
+
+template<class _FwdIt,
+ class _Pr,
+ class _Ty> inline
+ void replace_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred, const _Ty& _Val)
+ {
+ _Replace_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred, _Val);
+ }
+
+
+template<class _InIt, class _OutIt, class _Ty, class _InOutItCat>
+inline
+ _OutIt _Replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval,
+ _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = *_First == _Oldval ? _Newval : *_First;
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt, class _Ty>
+inline
+ _OutIt _Replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Replace_copy(_First, _Last, ::std:: _Checked_base(_Dest),
+ _Oldval, _Newval,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return (_Result);
+ }
+
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return _Replace_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Oldval, _Newval,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Ty, size_t _Size>
+inline
+_OutElem* replace_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size],
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return (replace_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Oldval, _Newval).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return _Replace_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Oldval, _Newval,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt, class _OutIt, class _Pr, class _Ty, class _InOutItCat>
+inline
+ _OutIt _Replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val, _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Pred(*_First) ? _Val : *_First;
+ return (_Dest);
+ }
+
+
+template<class _InIt, class _OutIt, class _Pr, class _Ty>
+inline
+ _OutIt _Replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Replace_copy_if(_First, _Last, ::std:: _Checked_base(_Dest),
+ _Pred, _Val,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return (_Result);
+ }
+
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return _Replace_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Val,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Pr, class _Ty, size_t _Size>
+inline
+_OutElem* replace_copy_if(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size],
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return (replace_copy_if(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Pred, _Val).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return _Replace_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Val,
+ _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Fn0> inline
+ void _Generate(_FwdIt _First, _FwdIt _Last, _Fn0 _Func)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Func();
+ }
+
+template<class _FwdIt,
+ class _Fn0> inline
+ void generate(_FwdIt _First, _FwdIt _Last, _Fn0 _Func)
+ {
+ _Generate(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Func);
+ }
+
+
+template<class _OutIt, class _Diff, class _Fn0, class _OutItCat>
+inline
+ void _Generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func,
+ _OutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ for (; 0 < _Count; --_Count, ++_Dest)
+ *_Dest = _Func();
+ }
+
+
+template<class _OutIt, class _Diff, class _Fn0>
+inline
+ void _Generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + _Count;
+ _Generate_n(::std:: _Checked_base(_Dest), _Count, _Func,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ }
+
+
+
+
+template<class _OutIt,
+ class _Diff,
+ class _Fn0> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
+ {
+ _Generate_n(_Dest, _Count, _Func,
+ _Iter_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutElem, class _Diff, class _Fn0, size_t _Size>
+inline
+void generate_n(_OutElem (&_Dest)[_Size], _Diff _Count, _Fn0 _Func)
+ {
+ generate_n(::stdext:: make_checked_array_iterator(_Dest, _Size), _Count, _Func);
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Fn0> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
+ {
+ _Generate_n(_Dest, _Count, _Func,
+ _Iter_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+ _OutIt _Remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First)
+ if (!(*_First == _Val))
+ *_Dest++ = *_First;
+ return (_Dest);
+ }
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val)
+ {
+ return _Remove_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Val, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Ty, size_t _Size>
+inline
+_OutElem* remove_copy(_InIt _First, _InIt _Last,
+ _OutElem (&_Dest)[_Size], const _Ty& _Val)
+ {
+ return (remove_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Val).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val)
+ {
+ return _Remove_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Val, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First != _Last; ++_First)
+ if (!_Pred(*_First))
+ *_Dest++ = *_First;
+ return (_Dest);
+ }
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Remove_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* remove_copy_if(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (remove_copy_if(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Remove_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt,
+ class _Ty> inline
+ _FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ _First = find(_First, _Last, _Val);
+ if (_First == _Last)
+ return (_First);
+ else
+ {
+ _FwdIt _First1 = _First;
+ return (::stdext:: unchecked_remove_copy(++_First1, _Last, _First, _Val));
+ }
+ }
+
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ _First = std::find_if(_First, _Last, _Pred);
+ if (_First == _Last)
+ return (_First);
+ else
+ {
+ _FwdIt _First1 = _First;
+ return (::stdext:: unchecked_remove_copy_if(++_First1, _Last, _First, _Pred));
+ }
+ }
+
+
+template<class _FwdIt> inline
+ _FwdIt _Unique(_FwdIt _First, _FwdIt _Last)
+ {
+ ;
+ for (_FwdIt _Firstb; (_Firstb = _First) != _Last && ++_First != _Last; )
+ if (*_Firstb == *_First)
+ {
+ for (; ++_First != _Last; )
+ if (!(*_Firstb == *_First))
+ *++_Firstb = *_First;
+ return (++_Firstb);
+ }
+ return (_Last);
+ }
+
+template<class _FwdIt> inline
+ _FwdIt unique(_FwdIt _First, _FwdIt _Last)
+ {
+ ::std:: _Checked_assign_from_base(_Last, _Unique(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last)));
+ return (_Last);
+ }
+
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt _Unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ for (_FwdIt _Firstb; (_Firstb = _First) != _Last && ++_First != _Last; )
+ if (_Pred(*_Firstb, *_First))
+ {
+ for (; ++_First != _Last; )
+ if (!_Pred(*_Firstb, *_First))
+ *++_Firstb = *_First;
+ return (++_Firstb);
+ }
+ return (_Last);
+ }
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_Last, _Unique(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_Last);
+ }
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+ _OutIt _Unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Ty *, _Range_checked_iterator_tag)
+ {
+ ;
+ _Ty _Val = *_First;
+
+ for (*_Dest++ = _Val; ++_First != _Last; )
+ if (!(_Val == *_First))
+ _Val = *_First, *_Dest++ = _Val;
+ return (_Dest);
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+ _OutIt _Unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ input_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, _Val_type(_First), _Range_checked_iterator_tag()));
+ }
+
+template<class _FwdIt,
+ class _OutIt> inline
+ _OutIt _Unique_copy(_FwdIt _First, _FwdIt _Last, _OutIt _Dest,
+ forward_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ _FwdIt _Firstb = _First;
+ for (*_Dest++ = *_Firstb; ++_First != _Last; )
+ if (!(*_Firstb == *_First))
+ _Firstb = _First, *_Dest++ = *_Firstb;
+ return (_Dest);
+ }
+
+template<class _BidIt,
+ class _OutIt> inline
+ _OutIt _Unique_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ bidirectional_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, forward_iterator_tag(), _Range_checked_iterator_tag()));
+ }
+
+template<class _RanIt,
+ class _OutIt> inline
+ _OutIt _Unique_copy(_RanIt _First, _RanIt _Last, _OutIt _Dest,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, forward_iterator_tag(), _Range_checked_iterator_tag()));
+ }
+
+
+
+template<class _InIt,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_First == _Last ? _Dest :
+ _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* unique_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (_First == _Last ? _Dest :
+ (unique_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base()));
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_First == _Last ? _Dest :
+ _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty,
+ class _Pr> inline
+ _OutIt _Unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred,
+ _Ty *, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ _Ty _Val = *_First;
+
+ for (*_Dest++ = _Val; ++_First != _Last; )
+ if (!_Pred(_Val, *_First))
+ _Val = *_First, *_Dest++ = _Val;
+ return (_Dest);
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred,
+ input_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, _Pred, _Val_type(_First)), _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Unique_copy(_FwdIt _First, _FwdIt _Last, _OutIt _Dest, _Pr _Pred,
+ forward_iterator_tag, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ _FwdIt _Firstb = _First;
+
+ for (*_Dest++ = *_Firstb; ++_First != _Last; )
+ if (!_Pred(*_Firstb, *_First))
+ _Firstb = _First, *_Dest++ = *_Firstb;
+ return (_Dest);
+ }
+
+template<class _BidIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Unique_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest, _Pr _Pred,
+ bidirectional_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag()));
+ }
+
+template<class _RanIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Unique_copy(_RanIt _First, _RanIt _Last, _OutIt _Dest, _Pr _Pred,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+ return (_Unique_copy(_First, _Last, _Dest, _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag()));
+ }
+
+
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* unique_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : (unique_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base()));
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt> inline
+ void _Reverse(_BidIt _First, _BidIt _Last, bidirectional_iterator_tag)
+ {
+ for (; _First != _Last && _First != --_Last; ++_First)
+ std::iter_swap(_First, _Last);
+ }
+
+template<class _RanIt> inline
+ void _Reverse(_RanIt _First, _RanIt _Last, random_access_iterator_tag)
+ {
+ ;
+ for (; _First < _Last; ++_First)
+ std::iter_swap(_First, --_Last);
+ }
+
+template<class _BidIt> inline
+ void reverse(_BidIt _First, _BidIt _Last)
+ {
+ _Reverse(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Iter_cat(_First));
+ }
+
+
+template<class _BidIt, class _OutIt, class _InOutItCat>
+inline
+ _OutIt _Reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_Dest)
+ *_Dest = *--_Last;
+ return (_Dest);
+ }
+
+
+template<class _BidIt, class _OutIt>
+inline
+ _OutIt _Reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last - _First);
+ _Reverse_copy(_First, _Last, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return (_Result);
+ }
+
+
+
+
+template<class _BidIt,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest)
+ {
+ return _Reverse_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, size_t _Size>
+inline
+_OutElem* reverse_copy(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (reverse_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _BidIt,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest)
+ {
+ return _Reverse_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt> inline
+ void _Rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,
+ forward_iterator_tag)
+ {
+ for (_FwdIt _Next = _Mid; ; )
+ {
+ std::iter_swap(_First, _Next);
+ if (++_First == _Mid)
+ if (++_Next == _Last)
+ break;
+ else
+ _Mid = _Next;
+ else if (++_Next == _Last)
+ _Next = _Mid;
+ }
+ }
+
+template<class _BidIt> inline
+ void _Rotate(_BidIt _First, _BidIt _Mid, _BidIt _Last,
+ bidirectional_iterator_tag)
+ {
+ std::reverse(_First, _Mid);
+ std::reverse(_Mid, _Last);
+ std::reverse(_First, _Last);
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Rotate(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Diff *, _Ty *)
+ {
+ ;
+ ;
+ _Diff _Shift = _Mid - _First;
+ _Diff _Count = _Last - _First;
+
+ for (_Diff _Factor = _Shift; _Factor != 0; )
+ {
+ _Diff _Tmp = _Count % _Factor;
+ _Count = _Factor, _Factor = _Tmp;
+ }
+
+ if (_Count < _Last - _First)
+ for (; 0 < _Count; --_Count)
+ {
+ _RanIt _Hole = _First + _Count;
+ _RanIt _Next = _Hole;
+ _Ty _Holeval = *_Hole;
+ _RanIt _Next1 = _Next + _Shift == _Last ? _First : _Next + _Shift;
+ while (_Next1 != _Hole)
+ {
+ *_Next = *_Next1;
+ _Next = _Next1;
+ _Next1 = _Shift < _Last - _Next1 ? _Next1 + _Shift
+ : _First + (_Shift - (_Last - _Next1));
+ }
+ *_Next = _Holeval;
+ }
+ }
+
+template<class _RanIt> inline
+ void _Rotate(_RanIt _First, _RanIt _Mid, _RanIt _Last,
+ random_access_iterator_tag)
+ {
+ _Rotate(_First, _Mid, _Last, _Dist_type(_First), _Val_type(_First));
+ }
+
+template<class _FwdIt> inline
+ void rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last)
+ {
+ if (_First != _Mid && _Mid != _Last)
+ _Rotate(::std:: _Checked_base(_First), ::std:: _Checked_base(_Mid), ::std:: _Checked_base(_Last), _Iter_cat(_First));
+ }
+
+
+template<class _FwdIt,
+ class _OutIt> inline
+ _OutIt _Rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest, _Range_checked_iterator_tag)
+ {
+ _Dest = ::stdext:: unchecked_copy(_Mid, _Last, _Dest);
+ return (::stdext:: unchecked_copy(_First, _Mid, _Dest));
+ }
+
+
+
+template<class _FwdIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest)
+ {
+ return _Rotate_copy(_First, _Mid, _Last, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt, class _OutElem, size_t _Size>
+inline
+_OutElem* rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (rotate_copy(_First, _Mid, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _FwdIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest)
+ {
+ return _Rotate_copy(_First, _Mid, _Last, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _RanIt,
+ class _Diff> inline
+ void _Random_shuffle(_RanIt _First, _RanIt _Last, _Diff *)
+ {
+ ;
+ const int _RANDOM_BITS = 15;
+ const int _RANDOM_MAX = (1U << _RANDOM_BITS) - 1;
+
+ _RanIt _Next = _First;
+ for (unsigned long _Index = 2; ++_Next != _Last; ++_Index)
+ {
+ unsigned long _Rm = _RANDOM_MAX;
+ unsigned long _Rn = ::rand() & _RANDOM_MAX;
+ for (; _Rm < _Index && _Rm != ~0UL;
+ _Rm = _Rm << _RANDOM_BITS | _RANDOM_MAX)
+ _Rn = _Rn << _RANDOM_BITS
+ | (::rand() & _RANDOM_MAX);
+
+ std::iter_swap(_Next, _First + _Diff(_Rn % _Index));
+ }
+ }
+
+template<class _RanIt> inline
+ void random_shuffle(_RanIt _First, _RanIt _Last)
+ {
+ if (_First != _Last)
+ _Random_shuffle(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dist_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Fn1,
+ class _Diff> inline
+ void _Random_shuffle(_RanIt _First, _RanIt _Last, _Fn1& _Func, _Diff *)
+ {
+ ;
+ ;
+ _RanIt _Next = _First;
+
+ for (_Diff _Index = 2; ++_Next != _Last; ++_Index)
+ std::iter_swap(_Next, _First + _Diff(_Func(_Index) % _Index));
+ }
+
+template<class _RanIt,
+ class _Fn1> inline
+ void random_shuffle(_RanIt _First, _RanIt _Last, _Fn1& _Func)
+ {
+ if (_First != _Last)
+ _Random_shuffle(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Func, _Dist_type(_First));
+ }
+
+
+template<class _BidIt,
+ class _Pr> inline
+ _BidIt _Partition(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ for (; ; ++_First)
+ {
+ for (; _First != _Last && _Pred(*_First); ++_First)
+ ;
+ if (_First == _Last)
+ break;
+
+ for (; _First != --_Last && !_Pred(*_Last); )
+ ;
+ if (_First == _Last)
+ break;
+
+ std::iter_swap(_First, _Last);
+ }
+ return (_First);
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ _BidIt partition(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Partition(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_First);
+ }
+
+
+template<class _BidIt,
+ class _Pr,
+ class _Diff,
+ class _Ty> inline
+ _BidIt _Stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred,
+ _Diff _Count, _Temp_iterator<_Ty>& _Tempbuf)
+ {
+ if (_Count == 0)
+ return (_First);
+ else if (_Count == 1)
+ return (_Pred(*_First) ? _Last : _First);
+ else if (_Count <= _Tempbuf._Maxlen())
+ {
+ _BidIt _Next = _First;
+ for (_Tempbuf._Init(); _First != _Last; ++_First)
+ if (_Pred(*_First))
+ *_Next++ = *_First;
+ else
+ *_Tempbuf++ = *_First;
+
+ ::stdext:: unchecked_copy(_Tempbuf._First(), _Tempbuf._Last(), _Next);
+ return (_Next);
+ }
+ else
+ {
+ _BidIt _Mid = _First;
+ std::advance(_Mid, _Count / 2);
+
+ _BidIt _Left = _Stable_partition(_First, _Mid, _Pred,
+ _Count / 2, _Tempbuf);
+ _BidIt _Right = _Stable_partition(_Mid, _Last, _Pred,
+ _Count - _Count / 2, _Tempbuf);
+
+ _Diff _Count1 = 0;
+ _Distance(_Left, _Mid, _Count1);
+ _Diff _Count2 = 0;
+ _Distance(_Mid, _Right, _Count2);
+
+ return (_Buffered_rotate(_Left, _Mid, _Right,
+ _Count1, _Count2, _Tempbuf));
+ }
+ }
+
+template<class _BidIt,
+ class _Pr,
+ class _Diff,
+ class _Ty> inline
+ _BidIt _Stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred,
+ _Diff *, _Ty *)
+ {
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ _Temp_iterator<_Ty> _Tempbuf(_Count);
+ return (_Stable_partition(_First, _Last, _Pred, _Count, _Tempbuf));
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ _BidIt stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ if (_First != _Last)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Stable_partition(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred, _Dist_type(_First), _Val_type(_First)));
+ }
+ return _First;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Push_heap(_RanIt _First, _Diff _Hole,
+ _Diff _Top, _Ty _Val)
+ {
+ for (_Diff _Idx = (_Hole - 1) / 2;
+ _Top < _Hole && ((*(_First + _Idx)) < (_Val));
+ _Idx = (_Hole - 1) / 2)
+ {
+ *(_First + _Hole) = *(_First + _Idx);
+ _Hole = _Idx;
+ }
+
+ *(_First + _Hole) = _Val;
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Push_heap_0(_RanIt _First, _RanIt _Last, _Diff *, _Ty *)
+ {
+ ;
+ _Diff _Count = _Last - _First;
+ if (0 < _Count)
+ _Push_heap(_First, _Count, _Diff(0), _Ty(*_Last));
+ }
+
+template<class _RanIt> inline
+ void push_heap(_RanIt _First, _RanIt _Last)
+ {
+
+
+
+
+
+
+
+ if (_First != _Last)
+
+
+ _Push_heap_0(::std:: _Checked_base(_First), ::std:: _Checked_base(--_Last),
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Push_heap(_RanIt _First, _Diff _Hole,
+ _Diff _Top, _Ty _Val, _Pr _Pred)
+ {
+ for (_Diff _Idx = (_Hole - 1) / 2;
+ _Top < _Hole && _Pred(*(_First + _Idx), _Val);
+ _Idx = (_Hole - 1) / 2)
+ {
+ *(_First + _Hole) = *(_First + _Idx);
+ _Hole = _Idx;
+ }
+
+ *(_First + _Hole) = _Val;
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Push_heap_0(_RanIt _First, _RanIt _Last, _Pr _Pred, _Diff *, _Ty *)
+ {
+ ;
+ _Diff _Count = _Last - _First;
+ if (0 < _Count)
+ _Push_heap(_First, _Count, _Diff(0), _Ty(*_Last), _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void push_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+
+
+
+
+
+
+
+ if (_First != _Last)
+
+
+ _Push_heap_0(::std:: _Checked_base(_First), ::std:: _Checked_base(--_Last), _Pred,
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Adjust_heap(_RanIt _First, _Diff _Hole, _Diff _Bottom, _Ty _Val)
+ {
+ _Diff _Top = _Hole;
+ _Diff _Idx = 2 * _Hole + 2;
+
+ for (; _Idx < _Bottom; _Idx = 2 * _Idx + 2)
+ {
+ if (((*(_First + _Idx)) < (*(_First + (_Idx - 1)))))
+ --_Idx;
+ *(_First + _Hole) = *(_First + _Idx), _Hole = _Idx;
+ }
+
+ if (_Idx == _Bottom)
+ {
+ *(_First + _Hole) = *(_First + (_Bottom - 1));
+ _Hole = _Bottom - 1;
+ }
+ _Push_heap(_First, _Hole, _Top, _Val);
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Pop_heap(_RanIt _First, _RanIt _Last, _RanIt _Dest,
+ _Ty _Val, _Diff *)
+ {
+ *_Dest = *_First;
+ _Adjust_heap(_First, _Diff(0), _Diff(_Last - _First), _Val);
+ }
+
+template<class _RanIt,
+ class _Ty> inline
+ void _Pop_heap_0(_RanIt _First, _RanIt _Last, _Ty *)
+ {
+ _Pop_heap(_First, _Last - 1, _Last - 1,
+ _Ty(*(_Last - 1)), _Dist_type(_First));
+ }
+
+template<class _RanIt> inline
+ void pop_heap(_RanIt _First, _RanIt _Last)
+ {
+ ;
+ if (1 < _Last - _First)
+ _Pop_heap_0(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Adjust_heap(_RanIt _First, _Diff _Hole, _Diff _Bottom,
+ _Ty _Val, _Pr _Pred)
+ {
+ _Diff _Top = _Hole;
+ _Diff _Idx = 2 * _Hole + 2;
+
+ for (; _Idx < _Bottom; _Idx = 2 * _Idx + 2)
+ {
+ if (_Pred(*(_First + _Idx), *(_First + (_Idx - 1))))
+ --_Idx;
+ *(_First + _Hole) = *(_First + _Idx), _Hole = _Idx;
+ }
+
+ if (_Idx == _Bottom)
+ {
+ *(_First + _Hole) = *(_First + (_Bottom - 1));
+ _Hole = _Bottom - 1;
+ }
+ _Push_heap(_First, _Hole, _Top, _Val, _Pred);
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Pop_heap(_RanIt _First, _RanIt _Last, _RanIt _Dest,
+ _Ty _Val, _Pr _Pred, _Diff *)
+ {
+ *_Dest = *_First;
+ _Adjust_heap(_First, _Diff(0), _Diff(_Last - _First), _Val, _Pred);
+ }
+
+template<class _RanIt,
+ class _Ty,
+ class _Pr> inline
+ void _Pop_heap_0(_RanIt _First, _RanIt _Last, _Pr _Pred, _Ty *)
+ {
+ _Pop_heap(_First, _Last - 1, _Last - 1,
+ _Ty(*(_Last - 1)), _Pred, _Dist_type(_First));
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void pop_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+ ;
+ if (1 < _Last - _First)
+ _Pop_heap_0(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred, _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ void _Make_heap(_RanIt _First, _RanIt _Last, _Diff *, _Ty *)
+ {
+ _Diff _Bottom = _Last - _First;
+
+ for (_Diff _Hole = _Bottom / 2; 0 < _Hole; )
+ {
+ --_Hole;
+ _Adjust_heap(_First, _Hole, _Bottom, _Ty(*(_First + _Hole)));
+ }
+ }
+
+template<class _RanIt> inline
+ void make_heap(_RanIt _First, _RanIt _Last)
+ {
+ if (1 < _Last - _First)
+ _Make_heap(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last),
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Make_heap(_RanIt _First, _RanIt _Last, _Pr _Pred, _Diff *, _Ty *)
+ {
+ _Diff _Bottom = _Last - _First;
+ for (_Diff _Hole = _Bottom / 2; 0 < _Hole; )
+ {
+ --_Hole;
+ _Adjust_heap(_First, _Hole, _Bottom,
+ _Ty(*(_First + _Hole)), _Pred);
+ }
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void make_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+ if (1 < _Last - _First)
+ _Make_heap(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred,
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _RanIt> inline
+ void _Sort_heap(_RanIt _First, _RanIt _Last)
+ {
+ ;
+ for (; 1 < _Last - _First; --_Last)
+ std::pop_heap(_First, _Last);
+ }
+
+template<class _RanIt> inline
+ void sort_heap(_RanIt _First, _RanIt _Last)
+ {
+ ;
+ _Sort_heap(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last));
+ }
+
+
+template<class _RanIt,
+ class _Pr> inline
+ void _Sort_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+ for (; 1 < _Last - _First; --_Last)
+ std::pop_heap(_First, _Last, _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void sort_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+ ;
+ _Sort_heap(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred);
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff> inline
+ _FwdIt _Lower_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Diff *)
+ {
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (((*_Mid) < (_Val)))
+ _First = ++_Mid, _Count -= _Count2 + 1;
+ else
+ _Count = _Count2;
+ }
+ return (_First);
+ }
+
+template<class _FwdIt,
+ class _Ty> inline
+ _FwdIt lower_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Lower_bound(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val, _Dist_type(_First)));
+ return _First;
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff,
+ class _Pr> inline
+ _FwdIt _Lower_bound(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred, _Diff *)
+ {
+ ;
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (_Pred(*_Mid, _Val))
+ _First = ++_Mid, _Count -= _Count2 + 1;
+ else
+ _Count = _Count2;
+ }
+ return (_First);
+ }
+
+template<class _FwdIt,
+ class _Ty,
+ class _Pr> inline
+ _FwdIt lower_bound(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Lower_bound(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val, _Pred, _Dist_type(_First)));
+ return _First;
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff> inline
+ _FwdIt _Upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Diff *)
+ {
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (!((_Val) < (*_Mid)))
+ _First = ++_Mid, _Count -= _Count2 + 1;
+ else
+ _Count = _Count2;
+ }
+ return (_First);
+ }
+
+template<class _FwdIt,
+ class _Ty> inline
+ _FwdIt upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Upper_bound(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val, _Dist_type(_First)));
+ return _First;
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff,
+ class _Pr> inline
+ _FwdIt _Upper_bound(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred, _Diff *)
+ {
+ ;
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (!_Pred(_Val, *_Mid))
+ _First = ++_Mid, _Count -= _Count2 + 1;
+ else
+ _Count = _Count2;
+ }
+ return (_First);
+ }
+
+template<class _FwdIt,
+ class _Ty,
+ class _Pr> inline
+ _FwdIt upper_bound(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Upper_bound(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Val, _Pred, _Dist_type(_First)));
+ return _First;
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff> inline
+ pair<_FwdIt, _FwdIt> _Equal_range(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Diff *)
+ {
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (((*_Mid) < (_Val)))
+ {
+ _First = ++_Mid;
+ _Count -= _Count2 + 1;
+ }
+ else if (_Val < *_Mid)
+ _Count = _Count2;
+ else
+ {
+ _FwdIt _First2 = lower_bound(_First, _Mid, _Val);
+ std::advance(_First, _Count);
+ _FwdIt _Last2 = upper_bound(++_Mid, _First, _Val);
+ return (pair<_FwdIt, _FwdIt>(_First2, _Last2));
+ }
+ }
+
+ return (pair<_FwdIt, _FwdIt>(_First, _First));
+ }
+
+template<class _FwdIt,
+ class _Ty> inline
+ pair<_FwdIt, _FwdIt> equal_range(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val)
+ {
+ return (_Equal_range(_First, _Last, _Val, _Dist_type(_First)));
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Diff,
+ class _Pr> inline
+ pair<_FwdIt, _FwdIt> _Equal_range(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred, _Diff *)
+ {
+ ;
+ ;
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+
+ for (; 0 < _Count; )
+ {
+ _Diff _Count2 = _Count / 2;
+ _FwdIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+ ;
+
+ if (_Pred(*_Mid, _Val))
+ {
+ _First = ++_Mid;
+ _Count -= _Count2 + 1;
+ }
+ else if (_Pred(_Val, *_Mid))
+ _Count = _Count2;
+ else
+ {
+ _FwdIt _First2 = lower_bound(_First, _Mid, _Val, _Pred);
+ std::advance(_First, _Count);
+ _FwdIt _Last2 = upper_bound(++_Mid, _First, _Val, _Pred);
+ return (pair<_FwdIt, _FwdIt>(_First2, _Last2));
+ }
+ }
+
+ return (pair<_FwdIt, _FwdIt>(_First, _First));
+ }
+
+template<class _FwdIt,
+ class _Ty,
+ class _Pr> inline
+ pair<_FwdIt, _FwdIt> equal_range(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred)
+ {
+ return (_Equal_range(_First, _Last, _Val, _Pred, _Dist_type(_First)));
+ }
+
+
+template<class _FwdIt,
+ class _Ty> inline
+ bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
+ {
+ _First = std::lower_bound(_First, _Last, _Val);
+ return (_First != _Last && !(_Val < *_First));
+ }
+
+
+template<class _FwdIt,
+ class _Ty,
+ class _Pr> inline
+ bool binary_search(_FwdIt _First, _FwdIt _Last,
+ const _Ty& _Val, _Pr _Pred)
+ {
+ _First = std::lower_bound(_First, _Last, _Val, _Pred);
+ return (_First != _Last && !_Pred(_Val, *_First));
+ }
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _InOutItCat>
+inline
+ _OutIt _Merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest,
+ _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; ++_Dest)
+ if (((*_First2) < (*_First1)))
+ *_Dest = *_First2, ++_First2;
+ else
+ *_Dest = *_First1, ++_First1;
+
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+template<class _InIt1, class _InIt2, class _OutIt>
+inline
+ _OutIt _Merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last1 - _First1) + (_Last2 - _First2);
+ _Merge(_First1, _Last1, _First2, _Last2, ::std:: _Checked_base(_Dest),
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (merge(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Pr, class _InOutItCat>
+inline
+ _OutIt _Merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred,
+ _InOutItCat, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; ++_Dest)
+ if (_Pred(*_First2, *_First1))
+ *_Dest = *_First2, ++_First2;
+ else
+ *_Dest = *_First1, ++_First1;
+
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Pr>
+inline
+ _OutIt _Merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred,
+ random_access_iterator_tag, _Range_checked_iterator_tag)
+ {
+
+ _OutIt _Result = _Dest + (_Last1 - _First1) + (_Last2 - _First2);
+ _Merge(_First1, _Last1, _First2, _Last2, ::std:: _Checked_base(_Dest), _Pred,
+ forward_iterator_tag(), _Range_checked_iterator_tag());
+ return _Result;
+ }
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred,
+ _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (merge(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred,
+ _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ _BidIt _Buffered_rotate(_BidIt _First, _BidIt _Mid, _BidIt _Last,
+ _Diff _Count1, _Diff _Count2, _Temp_iterator<_Ty>& _Tempbuf)
+ {
+ if (_Count1 <= _Count2 && _Count1 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_First, _Mid, _Tempbuf._Init());
+ ::stdext:: unchecked_copy(_Mid, _Last, _First);
+ return (::stdext:: unchecked_copy_backward(_Tempbuf._First(), _Tempbuf._Last(),
+ _Last));
+ }
+ else if (_Count2 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_Mid, _Last, _Tempbuf._Init());
+ ::stdext:: unchecked_copy_backward(_First, _Mid, _Last);
+ return (::stdext:: unchecked_copy(_Tempbuf._First(), _Tempbuf._Last(), _First));
+ }
+ else
+ {
+ std::rotate(_First, _Mid, _Last);
+ std::advance(_First, _Count2);
+ return (_First);
+ }
+ }
+
+template<class _BidIt1,
+ class _BidIt2,
+ class _BidIt3> inline
+ _BidIt3 _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Range_checked_iterator_tag)
+ {
+ for (; ; )
+ if (_First1 == _Last1)
+ return (::stdext:: unchecked_copy_backward(_First2, _Last2, _Dest));
+ else if (_First2 == _Last2)
+ return (::stdext:: unchecked_copy_backward(_First1, _Last1, _Dest));
+ else if (((*--_Last2) < (*--_Last1)))
+ *--_Dest = *_Last1, ++_Last2;
+ else
+ *--_Dest = *_Last2, ++_Last1;
+ }
+
+
+
+template<class _BidIt1, class _BidIt2, class _BidIt3>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest)
+ {
+ return _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest)
+ {
+ return _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ void _Buffered_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last,
+ _Diff _Count1, _Diff _Count2,
+ _Temp_iterator<_Ty>& _Tempbuf)
+ {
+ if (_Count1 + _Count2 == 2)
+ {
+ if (((*_Mid) < (*_First)))
+ std::iter_swap(_First, _Mid);
+ }
+ else if (_Count1 <= _Count2 && _Count1 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_First, _Mid, _Tempbuf._Init());
+ ::stdext:: unchecked_merge(_Tempbuf._First(), _Tempbuf._Last(), _Mid, _Last, _First);
+ }
+ else if (_Count2 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_Mid, _Last, _Tempbuf._Init());
+ ::stdext:: _Unchecked_merge_backward(_First, _Mid,
+ _Tempbuf._First(), _Tempbuf._Last(), _Last);
+ }
+ else
+ {
+ _BidIt _Firstn, _Lastn;
+ _Diff _Count1n, _Count2n;
+
+ if (_Count2 < _Count1)
+ {
+ _Count1n = _Count1 / 2, _Count2n = 0;
+ _Firstn = _First;
+ std::advance(_Firstn, _Count1n);
+ _Lastn = std::lower_bound(_Mid, _Last, *_Firstn);
+ _Distance(_Mid, _Lastn, _Count2n);
+ }
+ else
+ {
+ _Count1n = 0, _Count2n = _Count2 / 2;
+ _Lastn = _Mid;
+ std::advance(_Lastn, _Count2n);
+ _Firstn = std::upper_bound(_First, _Mid, *_Lastn);
+ _Distance(_First, _Firstn, _Count1n);
+ }
+
+ _BidIt _Midn = _Buffered_rotate(_Firstn, _Mid, _Lastn,
+ _Count1 - _Count1n, _Count2n, _Tempbuf);
+ _Buffered_merge(_First, _Firstn, _Midn,
+ _Count1n, _Count2n, _Tempbuf);
+ _Buffered_merge(_Midn, _Lastn, _Last,
+ _Count1 - _Count1n, _Count2 - _Count2n, _Tempbuf);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ void _Inplace_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last,
+ _Diff *, _Ty *)
+ {
+ ;
+ ;
+ _Diff _Count1 = 0;
+ _Distance(_First, _Mid, _Count1);
+ _Diff _Count2 = 0;
+ _Distance(_Mid, _Last, _Count2);
+ _Temp_iterator<_Ty> _Tempbuf(_Count1 < _Count2 ? _Count1 : _Count2);
+ _Buffered_merge(_First, _Mid, _Last,
+ _Count1, _Count2, _Tempbuf);
+ }
+
+template<class _BidIt> inline
+ void inplace_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last)
+ {
+ if (_First != _Mid && _Mid != _Last)
+ _Inplace_merge(::std:: _Checked_base(_First), ::std:: _Checked_base(_Mid), ::std:: _Checked_base(_Last),
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _BidIt1,
+ class _BidIt2,
+ class _BidIt3,
+ class _Pr> inline
+ _BidIt3 _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ for (; ; )
+ if (_First1 == _Last1)
+ return (::stdext:: unchecked_copy_backward(_First2, _Last2, _Dest));
+ else if (_First2 == _Last2)
+ return (::stdext:: unchecked_copy_backward(_First1, _Last1, _Dest));
+ else if (_Pred(*--_Last2, *--_Last1))
+ *--_Dest = *_Last1, ++_Last2;
+ else
+ *--_Dest = *_Last2, ++_Last1;
+ }
+
+
+
+template<class _BidIt1, class _BidIt2, class _BidIt3, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred)
+ {
+ return _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred)
+ {
+ return _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Buffered_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last,
+ _Diff _Count1, _Diff _Count2,
+ _Temp_iterator<_Ty>& _Tempbuf, _Pr _Pred)
+ {
+ if (_Count1 + _Count2 == 2)
+ {
+ if (_Pred(*_Mid, *_First))
+ std::iter_swap(_First, _Mid);
+ }
+ else if (_Count1 <= _Count2 && _Count1 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_First, _Mid, _Tempbuf._Init());
+ ::stdext:: unchecked_merge(_Tempbuf._First(), _Tempbuf._Last(),
+ _Mid, _Last, _First, _Pred);
+ }
+ else if (_Count2 <= _Tempbuf._Maxlen())
+ {
+ ::stdext:: unchecked_copy(_Mid, _Last, _Tempbuf._Init());
+ ::stdext:: _Unchecked_merge_backward(_First, _Mid, _Tempbuf._First(), _Tempbuf._Last(),
+ _Last, _Pred);
+ }
+ else
+ {
+ _BidIt _Firstn, _Lastn;
+ _Diff _Count1n, _Count2n;
+ if (_Count2 < _Count1)
+ {
+ _Count1n = _Count1 / 2, _Count2n = 0;
+ _Firstn = _First;
+ std::advance(_Firstn, _Count1n);
+ _Lastn = lower_bound(_Mid, _Last, *_Firstn, _Pred);
+ _Distance(_Mid, _Lastn, _Count2n);
+ }
+ else
+ {
+ _Count1n = 0, _Count2n = _Count2 / 2;
+ _Lastn = _Mid;
+ std::advance(_Lastn, _Count2n);
+ _Firstn = upper_bound(_First, _Mid, *_Lastn, _Pred);
+ _Distance(_First, _Firstn, _Count1n);
+ }
+ _BidIt _Midn = _Buffered_rotate(_Firstn, _Mid, _Lastn,
+ _Count1 - _Count1n, _Count2n, _Tempbuf);
+ _Buffered_merge(_First, _Firstn, _Midn,
+ _Count1n, _Count2n, _Tempbuf, _Pred);
+ _Buffered_merge(_Midn, _Lastn, _Last,
+ _Count1 - _Count1n, _Count2 - _Count2n, _Tempbuf, _Pred);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Inplace_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last, _Pr _Pred,
+ _Diff *, _Ty *)
+ {
+ ;
+ ;
+ _Diff _Count1 = 0;
+ _Distance(_First, _Mid, _Count1);
+ _Diff _Count2 = 0;
+ _Distance(_Mid, _Last, _Count2);
+ _Temp_iterator<_Ty> _Tempbuf(_Count1 < _Count2 ? _Count1 : _Count2);
+ _Buffered_merge(_First, _Mid, _Last,
+ _Count1, _Count2, _Tempbuf, _Pred);
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ void inplace_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last, _Pr _Pred)
+ {
+ if (_First != _Mid && _Mid != _Last)
+ _Inplace_merge(::std:: _Checked_base(_First), ::std:: _Checked_base(_Mid), ::std:: _Checked_base(_Last), _Pred,
+ _Dist_type(_First), _Val_type(_First));
+ }
+
+
+template<class _BidIt,
+ class _Ty> inline
+ void _Insertion_sort1(_BidIt _First, _BidIt _Last, _Ty *)
+ {
+ if (_First != _Last)
+ for (_BidIt _Next = _First; ++_Next != _Last; )
+ {
+ _BidIt _Next1 = _Next;
+ _Ty _Val = *_Next;
+
+ if (((_Val) < (*_First)))
+ {
+ ::stdext:: unchecked_copy_backward(_First, _Next, ++_Next1);
+ *_First = _Val;
+ }
+ else
+ {
+ for (_BidIt _First1 = _Next1;
+ ((_Val) < (*--_First1));
+ _Next1 = _First1)
+ *_Next1 = *_First1;
+ *_Next1 = _Val;
+ }
+ }
+ }
+
+template<class _BidIt> inline
+ void _Insertion_sort(_BidIt _First, _BidIt _Last)
+ {
+ _Insertion_sort1(_First, _Last, _Val_type(_First));
+ }
+
+template<class _RanIt> inline
+ void _Med3(_RanIt _First, _RanIt _Mid, _RanIt _Last)
+ {
+ if (((*_Mid) < (*_First)))
+ std::iter_swap(_Mid, _First);
+ if (((*_Last) < (*_Mid)))
+ std::iter_swap(_Last, _Mid);
+ if (((*_Mid) < (*_First)))
+ std::iter_swap(_Mid, _First);
+ }
+
+template<class _RanIt> inline
+ void _Median(_RanIt _First, _RanIt _Mid, _RanIt _Last)
+ {
+ if (40 < _Last - _First)
+ {
+ size_t _Step = (_Last - _First + 1) / 8;
+ _Med3(_First, _First + _Step, _First + 2 * _Step);
+ _Med3(_Mid - _Step, _Mid, _Mid + _Step);
+ _Med3(_Last - 2 * _Step, _Last - _Step, _Last);
+ _Med3(_First + _Step, _Mid, _Last - _Step);
+ }
+ else
+ _Med3(_First, _Mid, _Last);
+ }
+
+template<class _RanIt> inline
+ pair<_RanIt, _RanIt> _Unguarded_partition(_RanIt _First, _RanIt _Last)
+ {
+ _RanIt _Mid = _First + (_Last - _First) / 2;
+ _Median(_First, _Mid, _Last - 1);
+ _RanIt _Pfirst = _Mid;
+ _RanIt _Plast = _Pfirst + 1;
+
+ while (_First < _Pfirst
+ && !((*(_Pfirst - 1)) < (*_Pfirst))
+ && !(*_Pfirst < *(_Pfirst - 1)))
+ --_Pfirst;
+ while (_Plast < _Last
+ && !((*_Plast) < (*_Pfirst))
+ && !(*_Pfirst < *_Plast))
+ ++_Plast;
+
+ _RanIt _Gfirst = _Plast;
+ _RanIt _Glast = _Pfirst;
+
+ for (; ; )
+ {
+ for (; _Gfirst < _Last; ++_Gfirst)
+ if (((*_Pfirst) < (*_Gfirst)))
+ ;
+ else if (*_Gfirst < *_Pfirst)
+ break;
+ else
+ std::iter_swap(_Plast++, _Gfirst);
+ for (; _First < _Glast; --_Glast)
+ if (((*(_Glast - 1)) < (*_Pfirst)))
+ ;
+ else if (*_Pfirst < *(_Glast - 1))
+ break;
+ else
+ std::iter_swap(--_Pfirst, _Glast - 1);
+ if (_Glast == _First && _Gfirst == _Last)
+ return (pair<_RanIt, _RanIt>(_Pfirst, _Plast));
+
+ if (_Glast == _First)
+ {
+ if (_Plast != _Gfirst)
+ std::iter_swap(_Pfirst, _Plast);
+ ++_Plast;
+ std::iter_swap(_Pfirst++, _Gfirst++);
+ }
+ else if (_Gfirst == _Last)
+ {
+ if (--_Glast != --_Pfirst)
+ std::iter_swap(_Glast, _Pfirst);
+ std::iter_swap(_Pfirst, --_Plast);
+ }
+ else
+ std::iter_swap(_Gfirst++, --_Glast);
+ }
+ }
+
+template<class _RanIt,
+ class _Diff> inline
+ void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal)
+ {
+ _Diff _Count;
+ for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
+ {
+ pair<_RanIt, _RanIt> _Mid = _Unguarded_partition(_First, _Last);
+ _Ideal /= 2, _Ideal += _Ideal / 2;
+
+ if (_Mid.first - _First < _Last - _Mid.second)
+ _Sort(_First, _Mid.first, _Ideal), _First = _Mid.second;
+ else
+ _Sort(_Mid.second, _Last, _Ideal), _Last = _Mid.first;
+ }
+
+ if (_ISORT_MAX < _Count)
+ {
+ std::make_heap(_First, _Last);
+ std::sort_heap(_First, _Last);
+ }
+ else if (1 < _Count)
+ _Insertion_sort(_First, _Last);
+ }
+
+template<class _RanIt> inline
+ void sort(_RanIt _First, _RanIt _Last)
+ {
+ ;
+ _Sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Last - _First);
+ }
+
+
+template<class _BidIt,
+ class _Pr> inline
+ void _Insertion_sort(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ if (_First != _Last)
+ for (_BidIt _Next = _First; ++_Next != _Last; )
+ if (_Pred(*_Next, *_First))
+ {
+ _BidIt _Next1 = _Next;
+ std::rotate(_First, _Next, ++_Next1);
+ }
+ else
+ {
+ _BidIt _Dest = _Next;
+ for (_BidIt _Dest0 = _Dest;
+ _Pred(*_Next, *--_Dest0); )
+ _Dest = _Dest0;
+ if (_Dest != _Next)
+ {
+ _BidIt _Next1 = _Next;
+ std::rotate(_Dest, _Next, ++_Next1);
+ }
+ }
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void _Med3(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Pr _Pred)
+ {
+ if (_Pred(*_Mid, *_First))
+ std::iter_swap(_Mid, _First);
+ if (_Pred(*_Last, *_Mid))
+ std::iter_swap(_Last, _Mid);
+ if (_Pred(*_Mid, *_First))
+ std::iter_swap(_Mid, _First);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void _Median(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Pr _Pred)
+ {
+ if (40 < _Last - _First)
+ {
+ size_t _Step = (_Last - _First + 1) / 8;
+ _Med3(_First, _First + _Step, _First + 2 * _Step, _Pred);
+ _Med3(_Mid - _Step, _Mid, _Mid + _Step, _Pred);
+ _Med3(_Last - 2 * _Step, _Last - _Step, _Last, _Pred);
+ _Med3(_First + _Step, _Mid, _Last - _Step, _Pred);
+ }
+ else
+ _Med3(_First, _Mid, _Last, _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ pair<_RanIt, _RanIt> _Unguarded_partition(_RanIt _First, _RanIt _Last,
+ _Pr _Pred)
+ {
+ _RanIt _Mid = _First + (_Last - _First) / 2;
+ _Median(_First, _Mid, _Last - 1, _Pred);
+ _RanIt _Pfirst = _Mid;
+ _RanIt _Plast = _Pfirst + 1;
+
+ while (_First < _Pfirst
+ && !_Pred(*(_Pfirst - 1), *_Pfirst)
+ && !_Pred(*_Pfirst, *(_Pfirst - 1)))
+ --_Pfirst;
+ while (_Plast < _Last
+ && !_Pred(*_Plast, *_Pfirst)
+ && !_Pred(*_Pfirst, *_Plast))
+ ++_Plast;
+
+ _RanIt _Gfirst = _Plast;
+ _RanIt _Glast = _Pfirst;
+
+ for (; ; )
+ {
+ for (; _Gfirst < _Last; ++_Gfirst)
+ if (_Pred(*_Pfirst, *_Gfirst))
+ ;
+ else if (_Pred(*_Gfirst, *_Pfirst))
+ break;
+ else
+ std::iter_swap(_Plast++, _Gfirst);
+ for (; _First < _Glast; --_Glast)
+ if (_Pred(*(_Glast - 1), *_Pfirst))
+ ;
+ else if (_Pred(*_Pfirst, *(_Glast - 1)))
+ break;
+ else
+ std::iter_swap(--_Pfirst, _Glast - 1);
+ if (_Glast == _First && _Gfirst == _Last)
+ return (pair<_RanIt, _RanIt>(_Pfirst, _Plast));
+
+ if (_Glast == _First)
+ {
+ if (_Plast != _Gfirst)
+ std::iter_swap(_Pfirst, _Plast);
+ ++_Plast;
+ std::iter_swap(_Pfirst++, _Gfirst++);
+ }
+ else if (_Gfirst == _Last)
+ {
+ if (--_Glast != --_Pfirst)
+ std::iter_swap(_Glast, _Pfirst);
+ std::iter_swap(_Pfirst, --_Plast);
+ }
+ else
+ std::iter_swap(_Gfirst++, --_Glast);
+ }
+ }
+
+template<class _RanIt,
+ class _Diff,
+ class _Pr> inline
+ void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
+ {
+ _Diff _Count;
+ for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
+ {
+ pair<_RanIt, _RanIt> _Mid =
+ _Unguarded_partition(_First, _Last, _Pred);
+ _Ideal /= 2, _Ideal += _Ideal / 2;
+
+ if (_Mid.first - _First < _Last - _Mid.second)
+ _Sort(_First, _Mid.first, _Ideal, _Pred), _First = _Mid.second;
+ else
+ _Sort(_Mid.second, _Last, _Ideal, _Pred), _Last = _Mid.first;
+ }
+
+ if (_ISORT_MAX < _Count)
+ {
+ std::make_heap(_First, _Last, _Pred);
+ std::sort_heap(_First, _Last, _Pred);
+ }
+ else if (1 < _Count)
+ _Insertion_sort(_First, _Last, _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ _Sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Last - _First, _Pred);
+ }
+
+
+template<class _BidIt,
+ class _OutIt,
+ class _Diff> inline
+ void _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Range_checked_iterator_tag)
+ {
+ for (_Diff _Chunk2 = _Chunk * 2; _Chunk2 <= _Count; _Count -= _Chunk2)
+ {
+ _BidIt _Mid1 = _First;
+ std::advance(_Mid1, _Chunk);
+ _BidIt _Mid2 = _Mid1;
+ std::advance(_Mid2, _Chunk);
+
+ _Dest = ::stdext:: unchecked_merge(_First, _Mid1, _Mid1, _Mid2, _Dest);
+ _First = _Mid2;
+ }
+
+ if (_Count <= _Chunk)
+ ::stdext:: unchecked_copy(_First, _Last, _Dest);
+ else
+ {
+ _BidIt _Mid = _First;
+ std::advance(_Mid, _Chunk);
+
+ ::stdext:: unchecked_merge(_First, _Mid, _Mid, _Last, _Dest);
+ }
+ }
+
+
+
+template<class _BidIt, class _OutIt, class _Diff>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count)
+ {
+ _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, class _Diff, size_t _Size>
+inline
+void _Chunked_merge(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size],
+ _Diff _Chunk, _Diff _Count)
+ {
+ _Chunked_merge(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count)
+ {
+ _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ void _Buffered_merge_sort(_BidIt _First, _BidIt _Last, _Diff _Count,
+ _Temp_iterator<_Ty>& _Tempbuf)
+ {
+ _BidIt _Mid = _First;
+ for (_Diff _Nleft = _Count; _ISORT_MAX <= _Nleft; _Nleft -= _ISORT_MAX)
+ {
+ _BidIt _Midend = _Mid;
+ std::advance(_Midend, (int)_ISORT_MAX);
+
+ _Insertion_sort(_Mid, _Midend);
+ _Mid = _Midend;
+ }
+ _Insertion_sort(_Mid, _Last);
+
+ for (_Diff _Chunk = _ISORT_MAX; _Chunk < _Count; _Chunk *= 2)
+ {
+ ::stdext:: _Unchecked_chunked_merge(_First, _Last, _Tempbuf._Init(),
+ _Chunk, _Count);
+ ::stdext:: _Unchecked_chunked_merge(_Tempbuf._First(), _Tempbuf._Last(), _First,
+ _Chunk *= 2, _Count);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ void _Stable_sort(_BidIt _First, _BidIt _Last, _Diff _Count,
+ _Temp_iterator<_Ty>& _Tempbuf)
+ {
+ if (_Count <= _ISORT_MAX)
+ _Insertion_sort(_First, _Last);
+ else
+ {
+ _Diff _Count2 = (_Count + 1) / 2;
+ _BidIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+
+ if (_Count2 <= _Tempbuf._Maxlen())
+ {
+ _Buffered_merge_sort(_First, _Mid, _Count2, _Tempbuf);
+ _Buffered_merge_sort(_Mid, _Last, _Count - _Count2, _Tempbuf);
+ }
+ else
+ {
+ _Stable_sort(_First, _Mid, _Count2, _Tempbuf);
+ _Stable_sort(_Mid, _Last, _Count - _Count2, _Tempbuf);
+ }
+
+ _Buffered_merge(_First, _Mid, _Last,
+ _Count2, _Count - _Count2, _Tempbuf);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty> inline
+ void _Stable_sort(_BidIt _First, _BidIt _Last, _Diff *, _Ty *)
+ {
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ _Temp_iterator<_Ty> _Tempbuf((_Count + 1) / 2);
+ _Stable_sort(_First, _Last, _Count, _Tempbuf);
+ }
+
+template<class _BidIt> inline
+ void stable_sort(_BidIt _First, _BidIt _Last)
+ {
+ ;
+ if (_First != _Last)
+ {
+ _Stable_sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dist_type(_First), _Val_type(_First));
+ }
+ }
+
+
+template<class _BidIt,
+ class _OutIt,
+ class _Diff,
+ class _Pr> inline
+ void _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ for (_Diff _Chunk2 = _Chunk * 2; _Chunk2 <= _Count; _Count -= _Chunk2)
+ {
+ _BidIt _Mid1 = _First;
+ std::advance(_Mid1, _Chunk);
+ _BidIt _Mid2 = _Mid1;
+ std::advance(_Mid2, _Chunk);
+
+ _Dest = ::stdext:: unchecked_merge(_First, _Mid1, _Mid1, _Mid2, _Dest, _Pred);
+ _First = _Mid2;
+ }
+
+ if (_Count <= _Chunk)
+ ::stdext:: unchecked_copy(_First, _Last, _Dest);
+ else
+ {
+ _BidIt _Mid1 = _First;
+ std::advance(_Mid1, _Chunk);
+
+ ::stdext:: unchecked_merge(_First, _Mid1, _Mid1, _Last, _Dest, _Pred);
+ }
+ }
+
+
+
+template<class _BidIt, class _OutIt, class _Diff, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, class _Diff, class _Pr, size_t _Size>
+inline
+void _Chunked_merge(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size],
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ _Chunked_merge(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Buffered_merge_sort(_BidIt _First, _BidIt _Last, _Diff _Count,
+ _Temp_iterator<_Ty>& _Tempbuf, _Pr _Pred)
+ {
+ _BidIt _Mid = _First;
+ for (_Diff _Nleft = _Count; _ISORT_MAX <= _Nleft; _Nleft -= _ISORT_MAX)
+ {
+ _BidIt _Midn = _Mid;
+ std::advance(_Midn, (int)_ISORT_MAX);
+
+ _Insertion_sort(_Mid, _Midn, _Pred);
+ _Mid = _Midn;
+ }
+ _Insertion_sort(_Mid, _Last, _Pred);
+
+ for (_Diff _Chunk = _ISORT_MAX; _Chunk < _Count; _Chunk *= 2)
+ {
+ ::stdext:: _Unchecked_chunked_merge(_First, _Last, _Tempbuf._Init(),
+ _Chunk, _Count, _Pred);
+ ::stdext:: _Unchecked_chunked_merge(_Tempbuf._First(), _Tempbuf._Last(), _First,
+ _Chunk *= 2, _Count, _Pred);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Stable_sort(_BidIt _First, _BidIt _Last, _Diff _Count,
+ _Temp_iterator<_Ty>& _Tempbuf, _Pr _Pred)
+ {
+ if (_Count <= _ISORT_MAX)
+ _Insertion_sort(_First, _Last, _Pred);
+ else
+ {
+ _Diff _Count2 = (_Count + 1) / 2;
+ _BidIt _Mid = _First;
+ std::advance(_Mid, _Count2);
+
+ if (_Count2 <= _Tempbuf._Maxlen())
+ {
+ _Buffered_merge_sort(_First, _Mid, _Count2, _Tempbuf, _Pred);
+ _Buffered_merge_sort(_Mid, _Last, _Count - _Count2,
+ _Tempbuf, _Pred);
+ }
+ else
+ {
+ _Stable_sort(_First, _Mid, _Count2, _Tempbuf, _Pred);
+ _Stable_sort(_Mid, _Last, _Count - _Count2, _Tempbuf, _Pred);
+ }
+
+ _Buffered_merge(_First, _Mid, _Last,
+ _Count2, _Count - _Count2, _Tempbuf, _Pred);
+ }
+ }
+
+template<class _BidIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ void _Stable_sort(_BidIt _First, _BidIt _Last, _Diff *, _Ty *, _Pr _Pred)
+ {
+ _Diff _Count = 0;
+ _Distance(_First, _Last, _Count);
+ _Temp_iterator<_Ty> _Tempbuf((_Count + 1) / 2);
+ _Stable_sort(_First, _Last, _Count, _Tempbuf, _Pred);
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ void stable_sort(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ if (_First != _Last)
+ {
+ _Stable_sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last),
+ _Dist_type(_First), _Val_type(_First), _Pred);
+ }
+ }
+
+
+template<class _RanIt,
+ class _Ty> inline
+ void _Partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Ty *)
+ {
+ ;
+ ;
+ std::make_heap(_First, _Mid);
+
+ for (_RanIt _Next = _Mid; _Next < _Last; ++_Next)
+ if (((*_Next) < (*_First)))
+ _Pop_heap(_First, _Mid, _Next, _Ty(*_Next),
+ _Dist_type(_First));
+ std::sort_heap(_First, _Mid);
+ }
+
+template<class _RanIt> inline
+ void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last)
+ {
+ _Partial_sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Mid), ::std:: _Checked_base(_Last), _Val_type(_First));
+ }
+
+
+template<class _RanIt,
+ class _Ty,
+ class _Pr> inline
+ void _Partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last,
+ _Pr _Pred, _Ty *)
+ {
+ ;
+ ;
+ ;
+ std::make_heap(_First, _Mid, _Pred);
+
+ for (_RanIt _Next = _Mid; _Next < _Last; ++_Next)
+ if (_Pred(*_Next, *_First))
+ _Pop_heap(_First, _Mid, _Next, _Ty(*_Next), _Pred,
+ _Dist_type(_First));
+ std::sort_heap(_First, _Mid, _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Pr _Pred)
+ {
+ _Partial_sort(::std:: _Checked_base(_First), ::std:: _Checked_base(_Mid), ::std:: _Checked_base(_Last), _Pred, _Val_type(_First));
+ }
+
+
+template<class _InIt,
+ class _RanIt,
+ class _Diff,
+ class _Ty> inline
+ _RanIt _Partial_sort_copy(_InIt _First1, _InIt _Last1,
+ _RanIt _First2, _RanIt _Last2, _Diff *, _Ty *)
+ {
+ ;
+ ;
+ _RanIt _Mid2 = _First2;
+ for (; _First1 != _Last1 && _Mid2 != _Last2; ++_First1, ++_Mid2)
+ *_Mid2 = *_First1;
+ std::make_heap(_First2, _Mid2);
+
+ for (; _First1 != _Last1; ++_First1)
+ if (((*_First1) < (*_First2)))
+ _Adjust_heap(_First2, _Diff(0), _Diff(_Mid2 - _First2),
+ _Ty(*_First1));
+
+ std::sort_heap(_First2, _Mid2);
+ return (_Mid2);
+ }
+
+template<class _InIt,
+ class _RanIt> inline
+ _RanIt partial_sort_copy(_InIt _First1, _InIt _Last1,
+ _RanIt _First2, _RanIt _Last2)
+ {
+ if (_First1 != _Last1 && _First2 != _Last2)
+ ::std:: _Checked_assign_from_base(_First2, _Partial_sort_copy(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dist_type(_First2), _Val_type(_First1)));
+ return (_First2);
+ }
+
+
+template<class _InIt,
+ class _RanIt,
+ class _Diff,
+ class _Ty,
+ class _Pr> inline
+ _RanIt _Partial_sort_copy(_InIt _First1, _InIt _Last1,
+ _RanIt _First2, _RanIt _Last2, _Pr _Pred, _Diff *, _Ty *)
+ {
+ ;
+ ;
+ ;
+ _RanIt _Mid2 = _First2;
+ for (; _First1 != _Last1 && _Mid2 != _Last2; ++_First1, ++_Mid2)
+ *_Mid2 = *_First1;
+ std::make_heap(_First2, _Mid2, _Pred);
+
+ for (; _First1 != _Last1; ++_First1)
+ if (_Pred(*_First1, *_First2))
+ _Adjust_heap(_First2, _Diff(0), _Diff(_Mid2 - _First2),
+ _Ty(*_First1), _Pred);
+
+ std::sort_heap(_First2, _Mid2, _Pred);
+ return (_Mid2);
+ }
+
+template<class _InIt,
+ class _RanIt,
+ class _Pr> inline
+ _RanIt partial_sort_copy(_InIt _First1, _InIt _Last1,
+ _RanIt _First2, _RanIt _Last2, _Pr _Pred)
+ {
+ if (_First1 != _Last1 && _First2 != _Last2)
+ ::std:: _Checked_assign_from_base(_First2, _Partial_sort_copy(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred, _Dist_type(_First2), _Val_type(_First1)));
+ return (_First2);
+ }
+
+
+template<class _RanIt> inline
+ void _Nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last)
+ {
+ ;
+ for (; _ISORT_MAX < _Last - _First; )
+ {
+ pair<_RanIt, _RanIt> _Mid =
+ _Unguarded_partition(_First, _Last);
+
+ if (_Mid.second <= _Nth)
+ _First = _Mid.second;
+ else if (_Mid.first <= _Nth)
+ return;
+ else
+ _Last = _Mid.first;
+ }
+
+ _Insertion_sort(_First, _Last);
+ }
+
+template<class _RanIt> inline
+ void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last)
+ {
+ _Nth_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Nth), ::std:: _Checked_base(_Last));
+ }
+
+
+template<class _RanIt,
+ class _Pr> inline
+ void _Nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ for (; _ISORT_MAX < _Last - _First; )
+ {
+ pair<_RanIt, _RanIt> _Mid =
+ _Unguarded_partition(_First, _Last, _Pred);
+
+ if (_Mid.second <= _Nth)
+ _First = _Mid.second;
+ else if (_Mid.first <= _Nth)
+ return;
+ else
+ _Last = _Mid.first;
+ }
+
+ _Insertion_sort(_First, _Last, _Pred);
+ }
+
+template<class _RanIt,
+ class _Pr> inline
+ void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred)
+ {
+ _Nth_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Nth), ::std:: _Checked_base(_Last), _Pred);
+ }
+
+
+template<class _InIt1,
+ class _InIt2> inline
+ bool _Includes(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2)
+ {
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (((*_First2) < (*_First1)))
+ return (false);
+ else if (*_First1 < *_First2)
+ ++_First1;
+ else
+ ++_First1, ++_First2;
+ return (_First2 == _Last2);
+ }
+
+template<class _InIt1,
+ class _InIt2> inline
+ bool includes(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2)
+ {
+ return _Includes(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2));
+ }
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _Pr> inline
+ bool _Includes(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _Pr _Pred)
+ {
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (_Pred(*_First2, *_First1))
+ return (false);
+ else if (_Pred(*_First1, *_First2))
+ ++_First1;
+ else
+ ++_First1, ++_First2;
+ return (_First2 == _Last2);
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _Pr> inline
+ bool includes(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _Pr _Pred)
+ {
+ return _Includes(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Pred);
+ }
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt _Set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (((*_First1) < (*_First2)))
+ *_Dest++ = *_First1, ++_First1;
+ else if (*_First2 < *_First1)
+ *_Dest++ = *_First2, ++_First2;
+ else
+ *_Dest++ = *_First1, ++_First1, ++_First2;
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (set_union(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (_Pred(*_First1, *_First2))
+ *_Dest++ = *_First1, ++_First1;
+ else if (_Pred(*_First2, *_First1))
+ *_Dest++ = *_First2, ++_First2;
+ else
+ *_Dest++ = *_First1, ++_First1, ++_First2;
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (set_union(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt _Set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (((*_First1) < (*_First2)))
+ ++_First1;
+ else if (*_First2 < *_First1)
+ ++_First2;
+ else
+ *_Dest++ = *_First1++, ++_First2;
+ return (_Dest);
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (set_intersection(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (_Pred(*_First1, *_First2))
+ ++_First1;
+ else if (_Pred(*_First2, *_First1))
+ ++_First2;
+ else
+ *_Dest++ = *_First1++, ++_First2;
+ return (_Dest);
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (set_intersection(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt _Set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (((*_First1) < (*_First2)))
+ *_Dest++ = *_First1, ++_First1;
+ else if (*_First2 < *_First1)
+ ++_First2;
+ else
+ ++_First1, ++_First2;
+ return (::stdext:: unchecked_copy(_First1, _Last1, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (set_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (_Pred(*_First1, *_First2))
+ *_Dest++ = *_First1, ++_First1;
+ else if (_Pred(*_First2, *_First1))
+ ++_First2;
+ else
+ ++_First1, ++_First2;
+ return (::stdext:: unchecked_copy(_First1, _Last1, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (set_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt _Set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (((*_First1) < (*_First2)))
+ *_Dest++ = *_First1, ++_First1;
+ else if (*_First2 < *_First1)
+ *_Dest++ = *_First2, ++_First2;
+ else
+ ++_First1, ++_First2;
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (set_symmetric_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt _Set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred, _Range_checked_iterator_tag)
+ {
+ ;
+ ;
+ ;
+ for (; _First1 != _Last1 && _First2 != _Last2; )
+ if (_Pred(*_First1, *_First2))
+ *_Dest++ = *_First1, ++_First1;
+ else if (_Pred(*_First2, *_First1))
+ *_Dest++ = *_First2, ++_First2;
+ else
+ ++_First1, ++_First2;
+ _Dest = ::stdext:: unchecked_copy(_First1, _Last1, _Dest);
+ return (::stdext:: unchecked_copy(_First2, _Last2, _Dest));
+ }
+
+
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (set_symmetric_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _FwdIt> inline
+ _FwdIt _Max_element(_FwdIt _First, _FwdIt _Last)
+ {
+ ;
+ _FwdIt _Found = _First;
+ if (_First != _Last)
+ for (; ++_First != _Last; )
+ if (((*_Found) < (*_First)))
+ _Found = _First;
+ return (_Found);
+ }
+
+template<class _FwdIt> inline
+ _FwdIt max_element(_FwdIt _First, _FwdIt _Last)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Max_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last)));
+ return (_First);
+ }
+
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt _Max_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ _FwdIt _Found = _First;
+ if (_First != _Last)
+ for (; ++_First != _Last; )
+ if (_Pred(*_Found, *_First))
+ _Found = _First;
+ return (_Found);
+ }
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt max_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Max_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_First);
+ }
+
+
+template<class _FwdIt> inline
+ _FwdIt _Min_element(_FwdIt _First, _FwdIt _Last)
+ {
+ ;
+ _FwdIt _Found = _First;
+ if (_First != _Last)
+ for (; ++_First != _Last; )
+ if (((*_First) < (*_Found)))
+ _Found = _First;
+ return (_Found);
+ }
+
+template<class _FwdIt> inline
+ _FwdIt min_element(_FwdIt _First, _FwdIt _Last)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Min_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last)));
+ return (_First);
+ }
+
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt _Min_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ _FwdIt _Found = _First;
+ if (_First != _Last)
+ for (; ++_First != _Last; )
+ if (_Pred(*_First, *_Found))
+ _Found = _First;
+ return (_Found);
+ }
+
+template<class _FwdIt,
+ class _Pr> inline
+ _FwdIt min_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
+ {
+ ::std:: _Checked_assign_from_base(_First, _Min_element(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred));
+ return (_First);
+ }
+
+
+template<class _BidIt> inline
+ bool _Next_permutation(_BidIt _First, _BidIt _Last)
+ {
+ ;
+ _BidIt _Next = _Last;
+ if (_First == _Last || _First == --_Next)
+ return (false);
+
+ for (; ; )
+ {
+ _BidIt _Next1 = _Next;
+ if (((*--_Next) < (*_Next1)))
+ {
+ _BidIt _Mid = _Last;
+ for (; !((*_Next) < (*--_Mid)); )
+ ;
+ std::iter_swap(_Next, _Mid);
+ std::reverse(_Next1, _Last);
+ return (true);
+ }
+
+ if (_Next == _First)
+ {
+ std::reverse(_First, _Last);
+ return (false);
+ }
+ }
+ }
+
+template<class _BidIt> inline
+ bool next_permutation(_BidIt _First, _BidIt _Last)
+ {
+ return _Next_permutation(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last));
+ }
+
+
+template<class _BidIt,
+ class _Pr> inline
+ bool _Next_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ _BidIt _Next = _Last;
+ if (_First == _Last || _First == --_Next)
+ return (false);
+
+ for (; ; )
+ {
+ _BidIt _Next1 = _Next;
+ if (_Pred(*--_Next, *_Next1))
+ {
+ _BidIt _Mid = _Last;
+ for (; !_Pred(*_Next, *--_Mid); )
+ ;
+ std::iter_swap(_Next, _Mid);
+ std::reverse(_Next1, _Last);
+ return (true);
+ }
+
+ if (_Next == _First)
+ {
+ std::reverse(_First, _Last);
+ return (false);
+ }
+ }
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ bool next_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ return _Next_permutation(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred);
+ }
+
+
+template<class _BidIt> inline
+ bool _Prev_permutation(_BidIt _First, _BidIt _Last)
+ {
+ ;
+ _BidIt _Next = _Last;
+ if (_First == _Last || _First == --_Next)
+ return (false);
+ for (; ; )
+ {
+ _BidIt _Next1 = _Next;
+ if (((*_Next1) < (*--_Next)))
+ {
+ _BidIt _Mid = _Last;
+ for (; !((*--_Mid) < (*_Next)); )
+ ;
+ std::iter_swap(_Next, _Mid);
+ std::reverse(_Next1, _Last);
+ return (true);
+ }
+
+ if (_Next == _First)
+ {
+ std::reverse(_First, _Last);
+ return (false);
+ }
+ }
+ }
+
+template<class _BidIt> inline
+ bool prev_permutation(_BidIt _First, _BidIt _Last)
+ {
+ return _Prev_permutation(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last));
+ }
+
+
+template<class _BidIt,
+ class _Pr> inline
+ bool _Prev_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ ;
+ ;
+ _BidIt _Next = _Last;
+ if (_First == _Last || _First == --_Next)
+ return (false);
+
+ for (; ; )
+ {
+ _BidIt _Next1 = _Next;
+ if (_Pred(*_Next1, *--_Next))
+ {
+ _BidIt _Mid = _Last;
+ for (; !_Pred(*--_Mid, *_Next); )
+ ;
+ std::iter_swap(_Next, _Mid);
+ std::reverse(_Next1, _Last);
+ return (true);
+ }
+
+ if (_Next == _First)
+ {
+ std::reverse(_First, _Last);
+ return (false);
+ }
+ }
+ }
+
+template<class _BidIt,
+ class _Pr> inline
+ bool prev_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred)
+ {
+ return _Prev_permutation(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Pred);
+ }
+
+}
+
+namespace stdext {
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+ _OutIt unchecked_transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Func,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Func,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Fn1, size_t _Size>
+inline
+_OutElem* checked_transform(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Fn1 _Func)
+ {
+ return (checked_transform(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Func).base());
+ }
+
+template<class _InIt, class _OutIt, class _Fn1>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Func,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+ _OutIt unchecked_transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Dest, _Func,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result && ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Dest, _Func,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InElem2, class _OutElem, class _Fn2, size_t _SizeFirst2, size_t _SizeDest>
+inline
+_OutElem* checked_transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (checked_transform(_First1, _Last1,
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest),
+ _Func).base());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Fn2, size_t _SizeDest>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _InIt2 >::_Result, _OutElem* >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest), _Func,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Iter_cat(_First1),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()).base());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Fn2, size_t _SizeDest>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result, _OutElem* >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutElem (&_Dest)[_SizeDest], _Fn2 _Func)
+ {
+ return (::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::stdext:: make_checked_array_iterator(_Dest, _SizeDest), _Func,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Iter_cat(_First1),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()).base());
+ }
+
+template<class _InIt1, class _InElem2, class _OutIt, class _Fn2, size_t _SizeFirst2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return (::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ _Dest, _Func,
+ ::std:: _Iter_cat(_First1), ::std:: _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt1, class _InElem2, class _OutIt, class _Fn2, size_t _SizeFirst2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_SizeFirst2],
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return (::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::stdext:: make_checked_array_iterator(_First2, _SizeFirst2),
+ _Dest, _Func,
+ ::std:: _Iter_cat(_First1), ::std:: _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt1, class _InIt2, class _OutIt, class _Fn2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _InIt2 >::_Result || !::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
+ _OutIt _Dest, _Fn2 _Func)
+ {
+ return ::std:: _Transform(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2, _Dest, _Func,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Iter_random(_First1, _Dest),
+ ::std:: _Range_checked_iterator_tag(), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+ _FwdIt2 unchecked_swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)
+ {
+ return ::std:: _Swap_ranges(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _FwdIt2 >::_Result, _FwdIt2 >::_Result checked_swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)
+ {
+ return ::std:: _Swap_ranges(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt1, class _FwdElem2, size_t _Size>
+inline
+_FwdElem2* checked_swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdElem2 (&_First2)[_Size])
+ {
+ return (checked_swap_ranges(_First1, _Last1, ::stdext:: make_checked_array_iterator(_First2, _Size)).base());
+ }
+
+template<class _FwdIt1, class _FwdIt2>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _FwdIt2 >::_Result, _FwdIt2 >::_Result checked_swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)
+ {
+ return ::std:: _Swap_ranges(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), _First2,
+ ::std:: _Iter_random(_First1, _First2), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+ _OutIt unchecked_replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return ::std:: _Replace_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Oldval, _Newval,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return ::std:: _Replace_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Oldval, _Newval,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Ty, size_t _Size>
+inline
+_OutElem* checked_replace_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size],
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return (checked_replace_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Oldval, _Newval).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest,
+ const _Ty& _Oldval, const _Ty& _Newval)
+ {
+ return ::std:: _Replace_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Oldval, _Newval,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr,
+ class _Ty> inline
+ _OutIt unchecked_replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return ::std:: _Replace_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Val,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return ::std:: _Replace_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Val,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Pr, class _Ty, size_t _Size>
+inline
+_OutElem* checked_replace_copy_if(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size],
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return (checked_replace_copy_if(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Pred, _Val).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
+ _Pr _Pred, const _Ty& _Val)
+ {
+ return ::std:: _Replace_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, _Val,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Fn0> inline
+ void unchecked_generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
+ {
+ ::std:: _Generate_n(_Dest, _Count, _Func,
+ ::std:: _Iter_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Fn0> inline
+void checked_generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func, typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _Diff >::_Result = 0)
+ {
+ ::std:: _Generate_n(_Dest, _Count, _Func,
+ ::std:: _Iter_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _OutElem, class _Diff, class _Fn0, size_t _Size>
+inline
+void checked_generate_n(_OutElem (&_Dest)[_Size], _Diff _Count, _Fn0 _Func)
+ {
+ checked_generate_n(::stdext:: make_checked_array_iterator(_Dest, _Size), _Count, _Func);
+ }
+
+template<class _OutIt,
+ class _Diff,
+ class _Fn0> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+void checked_generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func, typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _Diff >::_Result = 0)
+ {
+ ::std:: _Generate_n(_Dest, _Count, _Func,
+ ::std:: _Iter_cat(_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+ _OutIt unchecked_remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val)
+ {
+ return ::std:: _Remove_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Val,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val)
+ {
+ return ::std:: _Remove_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Val, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Ty, size_t _Size>
+inline
+_OutElem* checked_remove_copy(_InIt _First, _InIt _Last,
+ _OutElem (&_Dest)[_Size], const _Ty& _Val)
+ {
+ return (checked_remove_copy(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size),
+ _Val).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Ty> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_remove_copy(_InIt _First, _InIt _Last,
+ _OutIt _Dest, const _Ty& _Val)
+ {
+ return ::std:: _Remove_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Val, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Remove_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Remove_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_remove_copy_if(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_remove_copy_if(_First, _Last,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Remove_copy_if(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+ _OutIt unchecked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_First == _Last ? _Dest :
+ ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_First == _Last ? _Dest :
+ ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_unique_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (_First == _Last ? _Dest :
+ (checked_unique_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base()));
+ }
+
+template<class _InIt,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest)
+ {
+ return (_First == _Last ? _Dest :
+ ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred,
+ ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _InIt, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_unique_copy(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : (checked_unique_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base()));
+ }
+
+template<class _InIt,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
+ {
+ return (_First == _Last ? _Dest
+ : ::std:: _Unique_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, _Pred, ::std:: _Iter_cat(_First), ::std:: _Range_checked_iterator_tag()));
+ }
+
+template<class _BidIt,
+ class _OutIt> inline
+ _OutIt unchecked_reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Reverse_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest,
+ ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Reverse_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_reverse_copy(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_reverse_copy(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _BidIt,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Reverse_copy(::std:: _Checked_base(_First), ::std:: _Checked_base(_Last), _Dest, ::std:: _Iter_random(_First, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt,
+ class _OutIt> inline
+ _OutIt unchecked_rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Rotate_copy(_First, _Mid, _Last, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt, class _OutIt>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Rotate_copy(_First, _Mid, _Last, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _FwdIt, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_rotate_copy(_First, _Mid, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _FwdIt, class _OutIt>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last, _OutIt _Dest)
+ {
+ return ::std:: _Rotate_copy(_First, _Mid, _Last, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt unchecked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_merge(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest, _Pred,
+ ::std:: _Iter_random(_First1, _First2,_Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred,
+ ::std:: _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_merge(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_merge(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred,
+ ::std:: _Iter_random(_First1, _First2, _Dest), ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3>
+inline
+ _BidIt3 _Unchecked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Checked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Checked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3, class _Pr>
+inline
+ _BidIt3 _Unchecked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Checked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt1, class _BidIt2, class _BidIt3, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _BidIt3 >::_Result, _BidIt3 >::_Result _Checked_merge_backward(_BidIt1 _First1, _BidIt1 _Last1,
+ _BidIt2 _First2, _BidIt2 _Last2, _BidIt3 _Dest, _Pr _Pred)
+ {
+ return ::std:: _Merge_backward(_First1, _Last1, _First2, _Last2, _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff>
+inline
+ void _Unchecked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, class _Diff, size_t _Size>
+inline
+void _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size],
+ _Diff _Chunk, _Diff _Count)
+ {
+ ::std:: _Chunked_merge(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff, class _Pr>
+inline
+ void _Unchecked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff, class _Pr>
+inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutElem, class _Diff, class _Pr, size_t _Size>
+inline
+void _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutElem (&_Dest)[_Size],
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ ::std:: _Chunked_merge(_First, _Last, ::stdext:: make_checked_array_iterator(_Dest, _Size), _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _BidIt, class _OutIt, class _Diff, class _Pr>
+inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, void >::_Result _Checked_chunked_merge(_BidIt _First, _BidIt _Last, _OutIt _Dest,
+ _Diff _Chunk, _Diff _Count, _Pr _Pred)
+ {
+ ::std:: _Chunked_merge(_First, _Last, _Dest, _Chunk, _Count, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt unchecked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_set_union(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest, _Pred,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_set_union(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_union(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_union(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt unchecked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_set_intersection(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest, _Pred,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_set_intersection(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_intersection(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_intersection(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt unchecked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_set_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest, _Pred,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_set_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+ _OutIt unchecked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, size_t _Size>
+inline
+_OutElem* checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size])
+ {
+ return (checked_set_symmetric_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size)).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+ _OutIt unchecked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1), ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2), _Dest, _Pred,
+ ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+typename ::std:: _Enable_if< ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+template<class _InIt1, class _InIt2, class _OutElem, class _Pr, size_t _Size>
+inline
+_OutElem* checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutElem (&_Dest)[_Size], _Pr _Pred)
+ {
+ return (checked_set_symmetric_difference(_First1, _Last1, _First2, _Last2,
+ ::stdext:: make_checked_array_iterator(_Dest, _Size), _Pred).base());
+ }
+
+template<class _InIt1,
+ class _InIt2,
+ class _OutIt,
+ class _Pr> inline
+__declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+typename ::std:: _Enable_if< ! ::std:: _Is_checked_iterator< _OutIt >::_Result, _OutIt >::_Result checked_set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,
+ _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred)
+ {
+ return ::std:: _Set_symmetric_difference(::std:: _Checked_base(_First1), ::std:: _Checked_base(_Last1),
+ ::std:: _Checked_base(_First2), ::std:: _Checked_base(_Last2),
+ _Dest, _Pred, ::std:: _Range_checked_iterator_tag());
+ }
+
+}
+
+
+ #pragma warning(default: 4244)
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push,1)
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push,1)
+
+
+namespace
+boost
+ {
+ namespace
+ exception_detail
+ {
+ template <class T>
+ class
+ refcount_ptr
+ {
+ public:
+
+ refcount_ptr():
+ px_(0)
+ {
+ }
+
+ ~refcount_ptr()
+ {
+ release();
+ }
+
+ refcount_ptr( refcount_ptr const & x ):
+ px_(x.px_)
+ {
+ add_ref();
+ }
+
+ refcount_ptr &
+ operator=( refcount_ptr const & x )
+ {
+ adopt(x.px_);
+ return *this;
+ }
+
+ void
+ adopt( T * px )
+ {
+ release();
+ px_=px;
+ add_ref();
+ }
+
+ T *
+ get() const
+ {
+ return px_;
+ }
+
+ private:
+
+ T * px_;
+
+ void
+ add_ref()
+ {
+ if( px_ )
+ px_->add_ref();
+ }
+
+ void
+ release()
+ {
+ if( px_ && px_->release() )
+ px_=0;
+ }
+ };
+ }
+
+
+
+ template <class Tag,class T>
+ class error_info;
+
+ typedef error_info<struct throw_function_,char const *> throw_function;
+ typedef error_info<struct throw_file_,char const *> throw_file;
+ typedef error_info<struct throw_line_,int> throw_line;
+
+ template <>
+ class
+ error_info<throw_function_,char const *>
+ {
+ public:
+ typedef char const * value_type;
+ value_type v_;
+ explicit
+ error_info( value_type v ):
+ v_(v)
+ {
+ }
+ };
+
+ template <>
+ class
+ error_info<throw_file_,char const *>
+ {
+ public:
+ typedef char const * value_type;
+ value_type v_;
+ explicit
+ error_info( value_type v ):
+ v_(v)
+ {
+ }
+ };
+
+ template <>
+ class
+ error_info<throw_line_,int>
+ {
+ public:
+ typedef int value_type;
+ value_type v_;
+ explicit
+ error_info( value_type v ):
+ v_(v)
+ {
+ }
+ };
+
+
+
+
+
+
+ class exception;
+
+
+
+
+
+
+ template <class T>
+ class shared_ptr;
+
+ namespace
+ exception_detail
+ {
+ class error_info_base;
+ struct type_info_;
+
+ struct
+ error_info_container
+ {
+ virtual char const * diagnostic_information( char const * ) const = 0;
+ virtual shared_ptr<error_info_base> get( type_info_ const & ) const = 0;
+ virtual void set( shared_ptr<error_info_base> const &, type_info_ const & ) = 0;
+ virtual void add_ref() const = 0;
+ virtual bool release() const = 0;
+ virtual refcount_ptr<exception_detail::error_info_container> clone() const = 0;
+
+ protected:
+
+ ~error_info_container() throw()
+ {
+ }
+ };
+
+ template <class>
+ struct get_info;
+
+ template <>
+ struct get_info<throw_function>;
+
+ template <>
+ struct get_info<throw_file>;
+
+ template <>
+ struct get_info<throw_line>;
+
+ char const * get_diagnostic_information( exception const &, char const * );
+
+ void copy_boost_exception( exception *, exception const * );
+
+ template <class E,class Tag,class T>
+ E const & set_info( E const &, error_info<Tag,T> const & );
+
+ template <class E>
+ E const & set_info( E const &, throw_function const & );
+
+ template <class E>
+ E const & set_info( E const &, throw_file const & );
+
+ template <class E>
+ E const & set_info( E const &, throw_line const & );
+ }
+
+
+
+
+
+
+ class
+ exception
+ {
+ protected:
+
+ exception():
+ throw_function_(0),
+ throw_file_(0),
+ throw_line_(-1)
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ virtual ~exception() throw()
+
+ = 0
+
+ ;
+
+
+
+
+ private:
+
+ template <class E>
+ friend E const & exception_detail::set_info( E const &, throw_function const & );
+
+ template <class E>
+ friend E const & exception_detail::set_info( E const &, throw_file const & );
+
+ template <class E>
+ friend E const & exception_detail::set_info( E const &, throw_line const & );
+
+ template <class E,class Tag,class T>
+ friend E const & exception_detail::set_info( E const &, error_info<Tag,T> const & );
+
+ friend char const * exception_detail::get_diagnostic_information( exception const &, char const * );
+
+ template <class>
+ friend struct exception_detail::get_info;
+ friend struct exception_detail::get_info<throw_function>;
+ friend struct exception_detail::get_info<throw_file>;
+ friend struct exception_detail::get_info<throw_line>;
+ friend void exception_detail::copy_boost_exception( exception *, exception const * );
+
+ mutable exception_detail::refcount_ptr<exception_detail::error_info_container> data_;
+ mutable char const * throw_function_;
+ mutable char const * throw_file_;
+ mutable int throw_line_;
+ };
+
+
+
+
+
+
+ inline
+ exception::
+ ~exception() throw()
+ {
+ }
+
+ namespace
+ exception_detail
+ {
+ template <class E>
+ E const &
+ set_info( E const & x, throw_function const & y )
+ {
+ x.throw_function_=y.v_;
+ return x;
+ }
+
+ template <class E>
+ E const &
+ set_info( E const & x, throw_file const & y )
+ {
+ x.throw_file_=y.v_;
+ return x;
+ }
+
+ template <class E>
+ E const &
+ set_info( E const & x, throw_line const & y )
+ {
+ x.throw_line_=y.v_;
+ return x;
+ }
+ }
+
+
+
+ namespace
+ exception_detail
+ {
+ template <class T>
+ struct
+ error_info_injector:
+ public T,
+ public exception
+ {
+ explicit
+ error_info_injector( T const & x ):
+ T(x)
+ {
+ }
+
+ ~error_info_injector() throw()
+ {
+ }
+ };
+
+ struct large_size { char c[256]; };
+ large_size dispatch_boost_exception( exception const * );
+
+ struct small_size { };
+ small_size dispatch_boost_exception( void const * );
+
+ template <class,int>
+ struct enable_error_info_helper;
+
+ template <class T>
+ struct
+ enable_error_info_helper<T,sizeof(large_size)>
+ {
+ typedef T type;
+ };
+
+ template <class T>
+ struct
+ enable_error_info_helper<T,sizeof(small_size)>
+ {
+ typedef error_info_injector<T> type;
+ };
+
+ template <class T>
+ struct
+ enable_error_info_return_type
+ {
+ typedef typename enable_error_info_helper<T,sizeof(exception_detail::dispatch_boost_exception(static_cast<T *>(0)))>::type type;
+ };
+ }
+
+ template <class T>
+ inline
+ typename
+ exception_detail::enable_error_info_return_type<T>::type
+ enable_error_info( T const & x )
+ {
+ typedef typename exception_detail::enable_error_info_return_type<T>::type rt;
+ return rt(x);
+ }
+
+
+
+ namespace
+ exception_detail
+ {
+ class
+ clone_base
+ {
+ public:
+
+ virtual clone_base const * clone() const = 0;
+ virtual void rethrow() const = 0;
+
+ virtual
+ ~clone_base() throw()
+ {
+ }
+ };
+
+ inline
+ void
+ copy_boost_exception( exception * a, exception const * b )
+ {
+ refcount_ptr<error_info_container> data;
+ if( error_info_container * d=b->data_.get() )
+ data = d->clone();
+ a->throw_file_ = b->throw_file_;
+ a->throw_line_ = b->throw_line_;
+ a->throw_function_ = b->throw_function_;
+ a->data_ = data;
+ }
+
+ inline
+ void
+ copy_boost_exception( void *, void const * )
+ {
+ }
+
+ template <class T>
+ class
+ clone_impl:
+ public T,
+ public clone_base
+ {
+ struct clone_tag { };
+ clone_impl( clone_impl const & x, clone_tag ):
+ T(x)
+ {
+ copy_boost_exception(this,&x);
+ }
+
+ public:
+
+ explicit
+ clone_impl( T const & x ):
+ T(x)
+ {
+ copy_boost_exception(this,&x);
+ }
+
+ ~clone_impl() throw()
+ {
+ }
+
+ private:
+
+ clone_base const *
+ clone() const
+ {
+ return new clone_impl(*this,clone_tag());
+ }
+
+ void
+ rethrow() const
+ {
+ throw*this;
+ }
+ };
+ }
+
+ template <class T>
+ inline
+ exception_detail::clone_impl<T>
+ enable_current_exception( T const & x )
+ {
+ return exception_detail::clone_impl<T>(x);
+ }
+ }
+
+
+#pragma warning(pop)
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+namespace detail
+{
+
+inline void current_function_helper()
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+}
+
+}
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+
+
+
+
+
+inline void throw_exception_assert_compatibility( std::exception const & ) { }
+
+template<class E> __declspec(noreturn) inline void throw_exception( E const & e )
+{
+
+
+ throw_exception_assert_compatibility(e);
+
+
+ throw enable_current_exception(enable_error_info(e));
+
+
+
+}
+
+
+
+
+ namespace
+ exception_detail
+ {
+ template <class E>
+ __declspec(noreturn)
+ void
+ throw_exception_( E const & x, char const * current_function, char const * file, int line )
+ {
+ boost::throw_exception(
+ set_info(
+ set_info(
+ set_info(
+ enable_error_info(x),
+ throw_function(current_function)),
+ throw_file(file)),
+ throw_line(line)));
+ }
+ }
+
+}
+
+
+#pragma warning(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+#pragma warning(disable:4412)
+
+
+
+
+
+namespace std {
+
+ #pragma warning(disable:4251)
+
+template<class _Elem,
+ class _Traits = char_traits<_Elem>,
+ class _Ax = allocator<_Elem> >
+ class basic_string;
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc>
+ class _String_const_iterator
+ : public _Ranit_base<_Elem, typename _Alloc::difference_type,
+ typename _Alloc::const_pointer, typename _Alloc::const_reference, _Iterator_base_secure>
+ {
+public:
+ typedef _String_const_iterator<_Elem, _Traits, _Alloc> _Myt;
+ typedef basic_string<_Elem, _Traits, _Alloc> _Mystring;
+
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Elem value_type;
+ typedef typename _Alloc::difference_type difference_type;
+ typedef typename _Alloc::const_pointer pointer;
+ typedef typename _Alloc::const_reference reference;
+
+
+ typedef _Range_checked_iterator_tag _Checked_iterator_category;
+
+
+
+ typedef pointer _Checked_iterator_base_type;
+
+ _Checked_iterator_base_type _Checked_iterator_base() const
+ {
+ return _Myptr;
+ }
+
+ void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
+ {
+ this->_Myptr = _Base;
+ }
+
+
+ _String_const_iterator()
+ {
+ _Myptr = 0;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _String_const_iterator(pointer _Ptr, const _Container_base *_Pstring)
+ {
+ { if (!(_Pstring != 0 && _Ptr != 0 && ((_Mystring *)_Pstring)->_Myptr() <= _Ptr && _Ptr <= (((_Mystring *)_Pstring)->_Myptr() + ((_Mystring *)_Pstring)->_Mysize))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ this->_Mycont = _Pstring;
+ _Myptr = _Ptr;
+ }
+
+
+
+
+
+
+
+
+
+
+
+ reference operator*() const
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Myptr < (((_Mystring *)this->_Mycont)->_Myptr() + ((_Mystring *)(this->_Mycont))->_Mysize))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+
+
+ return (*_Myptr);
+ }
+
+ pointer operator->() const
+ {
+ return (&**this);
+ }
+
+ _Myt& operator++()
+ {
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Myptr < (((_Mystring *)this->_Mycont)->_Myptr() + ((_Mystring *)this->_Mycont)->_Mysize))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+ ++_Myptr;
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ _Myt& operator--()
+ {
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Myptr > ((_Mystring *)this->_Mycont)->_Myptr())) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+ --_Myptr;
+ return (*this);
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ --*this;
+ return (_Tmp);
+ }
+
+ _Myt& operator+=(difference_type _Off)
+ {
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ { if (!(_Myptr + _Off <= (((_Mystring *)this->_Mycont)->_Myptr() + ((_Mystring *)this->_Mycont)->_Mysize) && _Myptr + _Off >= ((_Mystring *)this->_Mycont)->_Myptr())) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+ _Myptr += _Off;
+ return (*this);
+ }
+
+ _Myt operator+(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ _Myt& operator-=(difference_type _Off)
+ {
+ return (*this += -_Off);
+ }
+
+ _Myt operator-(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ difference_type operator-(const _Myt& _Right) const
+ {
+
+
+
+
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0 && this->_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+
+
+ return (_Myptr - _Right._Myptr);
+ }
+
+ reference operator[](difference_type _Off) const
+ {
+ return (*(*this + _Off));
+ }
+
+ bool operator==(const _Myt& _Right) const
+ {
+
+
+
+
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0 && this->_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+
+
+ return (_Myptr == _Right._Myptr);
+ }
+
+ bool operator!=(const _Myt& _Right) const
+ {
+ return (!(*this == _Right));
+ }
+
+ bool operator<(const _Myt& _Right) const
+ {
+
+
+
+
+ if (this->_Mycont != ((const _Container_base *)-2))
+ {
+ { if (!(this->_Mycont != 0 && this->_Mycont == _Right._Mycont)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ }
+
+
+ return (_Myptr < _Right._Myptr);
+ }
+
+ bool operator>(const _Myt& _Right) const
+ {
+ return (_Right < *this);
+ }
+
+ bool operator<=(const _Myt& _Right) const
+ {
+ return (!(_Right < *this));
+ }
+
+ bool operator>=(const _Myt& _Right) const
+ {
+ return (!(*this < _Right));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ static void __cdecl _Xlen()
+ {
+ _Mystring::_Xlen();
+ }
+
+ static void __cdecl _Xran()
+ {
+ _Mystring::_Xran();
+ }
+
+ static void __cdecl _Xinvarg()
+ {
+ _Mystring::_Xinvarg();
+ }
+
+ pointer _Myptr;
+ };
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ _String_const_iterator<_Elem, _Traits, _Alloc> __cdecl operator+(
+ typename _String_const_iterator<_Elem, _Traits, _Alloc>
+ ::difference_type _Off,
+ _String_const_iterator<_Elem, _Traits, _Alloc> _Next)
+ {
+ return (_Next += _Off);
+ }
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc>
+ class _String_iterator
+ : public _String_const_iterator<_Elem, _Traits, _Alloc>
+ {
+public:
+ typedef _String_iterator<_Elem, _Traits, _Alloc> _Myt;
+ typedef _String_const_iterator<_Elem, _Traits, _Alloc> _Mybase;
+
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Elem value_type;
+ typedef typename _Alloc::difference_type difference_type;
+ typedef typename _Alloc::pointer pointer;
+ typedef typename _Alloc::reference reference;
+
+ _String_iterator()
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+ _String_iterator(pointer _Ptr, const _Container_base *_Pstring)
+ : _Mybase(_Ptr, _Pstring)
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+ typedef pointer _Checked_iterator_base_type;
+
+ _Checked_iterator_base_type _Checked_iterator_base() const
+ {
+ return const_cast<pointer>(this->_Myptr);
+ }
+
+ void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
+ {
+ this->_Myptr = _Base;
+ }
+
+
+ reference operator*() const
+ {
+ return ((reference)**(_Mybase *)this);
+ }
+
+ pointer operator->() const
+ {
+ return (&**this);
+ }
+
+ _Myt& operator++()
+ {
+ ++(*(_Mybase *)this);
+ return (*this);
+ }
+
+ _Myt operator++(int)
+ {
+ _Myt _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ _Myt& operator--()
+ {
+ --(*(_Mybase *)this);
+ return (*this);
+ }
+
+ _Myt operator--(int)
+ {
+ _Myt _Tmp = *this;
+ --*this;
+ return (_Tmp);
+ }
+
+ _Myt& operator+=(difference_type _Off)
+ {
+ (*(_Mybase *)this) += _Off;
+ return (*this);
+ }
+
+ _Myt operator+(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ _Myt& operator-=(difference_type _Off)
+ {
+ return (*this += -_Off);
+ }
+
+ _Myt operator-(difference_type _Off) const
+ {
+ _Myt _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ difference_type operator-(const _Mybase& _Right) const
+ {
+ return ((_Mybase)*this - _Right);
+ }
+
+ reference operator[](difference_type _Off) const
+ {
+ return (*(*this + _Off));
+ }
+ };
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ _String_iterator<_Elem, _Traits, _Alloc> operator+(
+ typename _String_iterator<_Elem, _Traits, _Alloc>
+ ::difference_type _Off,
+ _String_iterator<_Elem, _Traits, _Alloc> _Next)
+ {
+ return (_Next += _Off);
+ }
+
+
+class _String_base
+ : public _Container_base
+ {
+public:
+ static void __cdecl _Xlen();
+
+ static void __cdecl _Xran();
+
+ static void __cdecl _Xinvarg();
+ };
+
+
+template<class _Ty,
+ class _Alloc>
+ class _String_val
+ : public _String_base
+ {
+protected:
+ typedef typename _Alloc::template
+ rebind<_Ty>::other _Alty;
+
+ _String_val(_Alty _Al = _Alty())
+ : _Alval(_Al)
+ {
+ }
+
+public:
+ _String_val(const _String_val &_Right)
+ : _Alval(_Right._Alval)
+ {
+
+
+
+
+
+
+ }
+
+protected:
+ _Alty _Alval;
+ };
+
+
+template<class _Elem,
+ class _Traits,
+ class _Ax>
+ class basic_string
+ : public _String_val<_Elem, _Ax>
+ {
+public:
+ typedef basic_string<_Elem, _Traits, _Ax> _Myt;
+ typedef _String_val<_Elem, _Ax> _Mybase;
+ typedef typename _Mybase::_Alty _Alloc;
+ typedef typename _Alloc::size_type size_type;
+ typedef typename _Alloc::difference_type _Dift;
+ typedef _Dift difference_type;
+ typedef typename _Alloc::pointer _Tptr;
+ typedef typename _Alloc::const_pointer _Ctptr;
+ typedef _Tptr pointer;
+ typedef _Ctptr const_pointer;
+ typedef typename _Alloc::reference _Reft;
+ typedef _Reft reference;
+ typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Alloc::value_type value_type;
+
+
+
+ typedef _String_iterator<_Elem, _Traits, _Alloc> iterator;
+ typedef _String_const_iterator<_Elem, _Traits, _Alloc> const_iterator;
+
+
+ friend class _String_const_iterator<_Elem, _Traits, _Alloc>;
+
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ basic_string()
+ : _Mybase()
+ {
+ _Tidy();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ explicit basic_string(const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+ _Tidy();
+ }
+
+ basic_string(const _Myt& _Right, size_type _Roff,
+ size_type _Count = npos)
+ : _Mybase()
+ {
+
+
+
+
+
+
+ _Tidy();
+ assign(_Right, _Roff, _Count);
+ }
+
+ basic_string(const _Myt& _Right, size_type _Roff, size_type _Count,
+ const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+
+
+
+
+
+
+ _Tidy();
+ assign(_Right, _Roff, _Count);
+ }
+
+ basic_string(const _Elem *_Ptr, size_type _Count)
+ : _Mybase()
+ {
+ _Tidy();
+ assign(_Ptr, _Count);
+ }
+
+ basic_string(const _Elem *_Ptr, size_type _Count, const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+ _Tidy();
+ assign(_Ptr, _Count);
+ }
+
+ basic_string(const _Elem *_Ptr)
+ : _Mybase()
+ {
+ _Tidy();
+ assign(_Ptr);
+ }
+
+ basic_string(const _Elem *_Ptr, const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+ _Tidy();
+ assign(_Ptr);
+ }
+
+ basic_string(size_type _Count, _Elem _Ch)
+ : _Mybase()
+ {
+ _Tidy();
+ assign(_Count, _Ch);
+ }
+
+ basic_string(size_type _Count, _Elem _Ch, const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+ _Tidy();
+ assign(_Count, _Ch);
+ }
+
+ template<class _It>
+ basic_string(_It _First, _It _Last)
+ : _Mybase()
+ {
+ _Tidy();
+ _Construct(_First, _Last, _Iter_cat(_First));
+ }
+
+ template<class _It>
+ basic_string(_It _First, _It _Last, const _Alloc& _Al)
+ : _Mybase(_Al)
+ {
+ _Tidy();
+ _Construct(_First, _Last, _Iter_cat(_First));
+ }
+
+ basic_string(const_pointer _First, const_pointer _Last)
+ : _Mybase()
+ {
+
+
+
+ _Tidy();
+ if (_First != _Last)
+ assign(&*_First, _Last - _First);
+ }
+
+ basic_string(const_iterator _First, const_iterator _Last)
+ : _Mybase()
+ {
+
+
+
+ _Tidy();
+ if (_First != _Last)
+ assign(&*_First, _Last - _First);
+ }
+
+
+
+
+
+ basic_string(const _Myt& _Right)
+ : _Mybase(_Right)
+ {
+ _Tidy();
+ assign(_Right, 0, npos);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<class _It>
+ void _Construct(_It _Count,
+ _It _Ch, _Int_iterator_tag)
+ {
+ assign((size_type)_Count, (_Elem)_Ch);
+ }
+
+ template<class _It>
+ void _Construct(_It _First,
+ _It _Last, input_iterator_tag)
+ {
+ try {
+ for (; _First != _Last; ++_First)
+ append((size_type)1, (_Elem)*_First);
+ } catch (...) {
+ _Tidy(true);
+ throw;
+ }
+ }
+
+ template<class _It>
+ void _Construct(_It _First,
+ _It _Last, forward_iterator_tag)
+ {
+
+
+
+
+
+
+
+ size_type _Count = 0;
+ _Distance(_First, _Last, _Count);
+ reserve(_Count);
+
+ try {
+ for (; _First != _Last; ++_First)
+ append((size_type)1, (_Elem)*_First);
+ } catch (...) {
+ _Tidy(true);
+ throw;
+ }
+ }
+
+ ~basic_string()
+ {
+ _Tidy(true);
+ }
+
+ typedef _Traits traits_type;
+ typedef _Alloc allocator_type;
+
+ static const size_type npos;
+
+ _Myt& operator=(const _Myt& _Right)
+ {
+ return (assign(_Right));
+ }
+
+ _Myt& operator=(const _Elem *_Ptr)
+ {
+ return (assign(_Ptr));
+ }
+
+ _Myt& operator=(_Elem _Ch)
+ {
+ return (assign(1, _Ch));
+ }
+
+ _Myt& operator+=(const _Myt& _Right)
+ {
+ return (append(_Right));
+ }
+
+ _Myt& operator+=(const _Elem *_Ptr)
+ {
+ return (append(_Ptr));
+ }
+
+ _Myt& operator+=(_Elem _Ch)
+ {
+ return (append((size_type)1, _Ch));
+ }
+
+ _Myt& append(const _Myt& _Right)
+ {
+ return (append(_Right, 0, npos));
+ }
+
+ _Myt& append(const _Myt& _Right,
+ size_type _Roff, size_type _Count)
+ {
+ if (_Right.size() < _Roff)
+ _String_base::_Xran();
+ size_type _Num = _Right.size() - _Roff;
+ if (_Num < _Count)
+ _Count = _Num;
+ if (npos - _Mysize <= _Count || _Mysize + _Count < _Mysize)
+ _String_base::_Xlen();
+
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Mysize, _Myres - _Mysize,
+ _Right._Myptr() + _Roff, _Count);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& append(const _Elem *_Ptr, size_type _Count)
+ {
+ if (_Inside(_Ptr))
+ return (append(*this, _Ptr - _Myptr(), _Count));
+ if (npos - _Mysize <= _Count || _Mysize + _Count < _Mysize)
+ _String_base::_Xlen();
+
+ size_type _Num;
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Mysize, _Myres - _Mysize, _Ptr, _Count);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& append(const _Elem *_Ptr)
+ {
+ return (append(_Ptr, _Traits::length(_Ptr)));
+ }
+
+ _Myt& append(size_type _Count, _Elem _Ch)
+ {
+ if (npos - _Mysize <= _Count)
+ _String_base::_Xlen();
+
+ size_type _Num;
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Chassign(_Mysize, _Count, _Ch);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ template<class _It>
+ _Myt& append(_It _First, _It _Last)
+ {
+ return (_Append(_First, _Last, _Iter_cat(_First)));
+ }
+
+ template<class _It>
+ _Myt& _Append(_It _Count, _It _Ch, _Int_iterator_tag)
+ {
+ return (append((size_type)_Count, (_Elem)_Ch));
+ }
+
+ template<class _It>
+ _Myt& _Append(_It _First, _It _Last, input_iterator_tag)
+ {
+ return (replace(end(), end(), _First, _Last));
+ }
+
+ _Myt& append(const_pointer _First, const_pointer _Last)
+ {
+ return (replace(end(), end(), _First, _Last));
+ }
+
+ _Myt& append(const_iterator _First, const_iterator _Last)
+ {
+ return (replace(end(), end(), _First, _Last));
+ }
+
+ _Myt& assign(const _Myt& _Right)
+ {
+ return (assign(_Right, 0, npos));
+ }
+
+ _Myt& assign(const _Myt& _Right,
+ size_type _Roff, size_type _Count)
+ {
+ if (_Right.size() < _Roff)
+ _String_base::_Xran();
+ size_type _Num = _Right.size() - _Roff;
+ if (_Count < _Num)
+ _Num = _Count;
+
+ if (this == &_Right)
+ erase((size_type)(_Roff + _Num)), erase(0, _Roff);
+ else if (_Grow(_Num))
+ {
+ _Traits_helper::copy_s<_Traits>(_Myptr(), _Myres, _Right._Myptr() + _Roff, _Num);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& assign(const _Elem *_Ptr, size_type _Num)
+ {
+ if (_Inside(_Ptr))
+ return (assign(*this, _Ptr - _Myptr(), _Num));
+
+ if (_Grow(_Num))
+ {
+ _Traits_helper::copy_s<_Traits>(_Myptr(), _Myres, _Ptr, _Num);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& assign(const _Elem *_Ptr)
+ {
+ return (assign(_Ptr, _Traits::length(_Ptr)));
+ }
+
+ _Myt& assign(size_type _Count, _Elem _Ch)
+ {
+ if (_Count == npos)
+ _String_base::_Xlen();
+
+ if (_Grow(_Count))
+ {
+ _Chassign(0, _Count, _Ch);
+ _Eos(_Count);
+ }
+ return (*this);
+ }
+
+ template<class _It>
+ _Myt& assign(_It _First, _It _Last)
+ {
+ return (_Assign(_First, _Last, _Iter_cat(_First)));
+ }
+
+ template<class _It>
+ _Myt& _Assign(_It _Count, _It _Ch, _Int_iterator_tag)
+ {
+ return (assign((size_type)_Count, (_Elem)_Ch));
+ }
+
+ template<class _It>
+ _Myt& _Assign(_It _First, _It _Last, input_iterator_tag)
+ {
+ return (replace(begin(), end(), _First, _Last));
+ }
+
+ _Myt& assign(const_pointer _First, const_pointer _Last)
+ {
+ return (replace(begin(), end(), _First, _Last));
+ }
+
+ _Myt& assign(const_iterator _First, const_iterator _Last)
+ {
+ return (replace(begin(), end(), _First, _Last));
+ }
+
+ _Myt& insert(size_type _Off, const _Myt& _Right)
+ {
+ return (insert(_Off, _Right, 0, npos));
+ }
+
+ _Myt& insert(size_type _Off,
+ const _Myt& _Right, size_type _Roff, size_type _Count)
+ {
+ if (_Mysize < _Off || _Right.size() < _Roff)
+ _String_base::_Xran();
+ size_type _Num = _Right.size() - _Roff;
+ if (_Num < _Count)
+ _Count = _Num;
+ if (npos - _Mysize <= _Count)
+ _String_base::_Xlen();
+
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off, _Mysize - _Off);
+ if (this == &_Right)
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Myptr() + (_Off < _Roff ? _Roff + _Count : _Roff),
+ _Count);
+ else
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Right._Myptr() + _Roff, _Count);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& insert(size_type _Off,
+ const _Elem *_Ptr, size_type _Count)
+ {
+ if (_Inside(_Ptr))
+ return (insert(_Off, *this,
+ _Ptr - _Myptr(), _Count));
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (npos - _Mysize <= _Count)
+ _String_base::_Xlen();
+ size_type _Num;
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off, _Mysize - _Off);
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Off, _Myres - _Off, _Ptr, _Count);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& insert(size_type _Off, const _Elem *_Ptr)
+ {
+ return (insert(_Off, _Ptr, _Traits::length(_Ptr)));
+ }
+
+ _Myt& insert(size_type _Off,
+ size_type _Count, _Elem _Ch)
+ {
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (npos - _Mysize <= _Count)
+ _String_base::_Xlen();
+ size_type _Num;
+ if (0 < _Count && _Grow(_Num = _Mysize + _Count))
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off, _Mysize - _Off);
+ _Chassign(_Off, _Count, _Ch);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ iterator insert(iterator _Where)
+ {
+ return (insert(_Where, _Elem()));
+ }
+
+ iterator insert(iterator _Where, _Elem _Ch)
+ {
+ size_type _Off = _Pdif(_Where, begin());
+ insert(_Off, 1, _Ch);
+ return (begin() + _Off);
+ }
+
+ void insert(iterator _Where, size_type _Count, _Elem _Ch)
+ {
+ size_type _Off = _Pdif(_Where, begin());
+ insert(_Off, _Count, _Ch);
+ }
+
+ template<class _It>
+ void insert(iterator _Where, _It _First, _It _Last)
+ {
+ _Insert(_Where, _First, _Last, _Iter_cat(_First));
+ }
+
+ template<class _It>
+ void _Insert(iterator _Where, _It _Count, _It _Ch,
+ _Int_iterator_tag)
+ {
+ insert(_Where, (size_type)_Count, (_Elem)_Ch);
+ }
+
+ template<class _It>
+ void _Insert(iterator _Where, _It _First, _It _Last,
+ input_iterator_tag)
+ {
+ replace(_Where, _Where, _First, _Last);
+ }
+
+ void insert(iterator _Where, const_pointer _First, const_pointer _Last)
+ {
+ replace(_Where, _Where, _First, _Last);
+ }
+
+ void insert(iterator _Where, const_iterator _First, const_iterator _Last)
+ {
+ replace(_Where, _Where, _First, _Last);
+ }
+
+ _Myt& erase(size_type _Off = 0,
+ size_type _Count = npos)
+ {
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _Count)
+ _Count = _Mysize - _Off;
+ if (0 < _Count)
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off, _Myptr() + _Off + _Count,
+ _Mysize - _Off - _Count);
+ size_type _Newsize = _Mysize - _Count;
+ _Eos(_Newsize);
+ }
+ return (*this);
+ }
+
+ iterator erase(iterator _Where)
+ {
+ size_type _Count = _Pdif(_Where, begin());
+ erase(_Count, 1);
+ return (iterator(_Myptr() + _Count, this));
+ }
+
+ iterator erase(iterator _First, iterator _Last)
+ {
+ size_type _Count = _Pdif(_First, begin());
+ erase(_Count, _Pdif(_Last, _First));
+ return (iterator(_Myptr() + _Count, this));
+ }
+
+ void clear()
+ {
+ erase(begin(), end());
+ }
+
+ _Myt& replace(size_type _Off, size_type _N0, const _Myt& _Right)
+ {
+ return (replace(_Off, _N0, _Right, 0, npos));
+ }
+
+ _Myt& replace(size_type _Off,
+ size_type _N0, const _Myt& _Right, size_type _Roff, size_type _Count)
+ {
+ if (_Mysize < _Off || _Right.size() < _Roff)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _N0)
+ _N0 = _Mysize - _Off;
+ size_type _Num = _Right.size() - _Roff;
+ if (_Num < _Count)
+ _Count = _Num;
+ if (npos - _Count <= _Mysize - _N0)
+ _String_base::_Xlen();
+
+ size_type _Nm = _Mysize - _N0 - _Off;
+ size_type _Newsize = _Mysize + _Count - _N0;
+ if (_Mysize < _Newsize)
+ _Grow(_Newsize);
+
+ if (this != &_Right)
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Right._Myptr() + _Roff, _Count);
+ }
+ else if (_Count <= _N0)
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Myptr() + _Roff, _Count);
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ }
+ else if (_Roff <= _Off)
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Myptr() + _Roff, _Count);
+ }
+ else if (_Off + _N0 <= _Roff)
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Myptr() + (_Roff + _Count - _N0), _Count);
+ }
+ else
+ {
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off, _Myres - _Off,
+ _Myptr() + _Roff, _N0);
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _N0, _Myres - _Off - _N0, _Myptr() + _Roff + _Count,
+ _Count - _N0);
+ }
+
+ _Eos(_Newsize);
+ return (*this);
+ }
+
+ _Myt& replace(size_type _Off,
+ size_type _N0, const _Elem *_Ptr, size_type _Count)
+ {
+ if (_Inside(_Ptr))
+ return (replace(_Off, _N0, *this,
+ _Ptr - _Myptr(), _Count));
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _N0)
+ _N0 = _Mysize - _Off;
+ if (npos - _Count <= _Mysize - _N0)
+ _String_base::_Xlen();
+ size_type _Nm = _Mysize - _N0 - _Off;
+
+ if (_Count < _N0)
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ size_type _Num;
+ if ((0 < _Count || 0 < _N0) && _Grow(_Num = _Mysize + _Count - _N0))
+ {
+ if (_N0 < _Count)
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Traits_helper::copy_s<_Traits>(_Myptr() + _Off, _Myres - _Off, _Ptr, _Count);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& replace(size_type _Off, size_type _N0, const _Elem *_Ptr)
+ {
+ return (replace(_Off, _N0, _Ptr, _Traits::length(_Ptr)));
+ }
+
+ _Myt& replace(size_type _Off,
+ size_type _N0, size_type _Count, _Elem _Ch)
+ {
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _N0)
+ _N0 = _Mysize - _Off;
+ if (npos - _Count <= _Mysize - _N0)
+ _String_base::_Xlen();
+ size_type _Nm = _Mysize - _N0 - _Off;
+
+ if (_Count < _N0)
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ size_type _Num;
+ if ((0 < _Count || 0 < _N0) && _Grow(_Num = _Mysize + _Count - _N0))
+ {
+ if (_N0 < _Count)
+ _Traits_helper::move_s<_Traits>(_Myptr() + _Off + _Count, _Myres - _Off - _Count,
+ _Myptr() + _Off + _N0, _Nm);
+ _Chassign(_Off, _Count, _Ch);
+ _Eos(_Num);
+ }
+ return (*this);
+ }
+
+ _Myt& replace(iterator _First, iterator _Last, const _Myt& _Right)
+ {
+ return (replace(
+ _Pdif(_First, begin()), _Pdif(_Last, _First), _Right));
+ }
+
+ _Myt& replace(iterator _First, iterator _Last, const _Elem *_Ptr,
+ size_type _Count)
+ {
+ return (replace(
+ _Pdif(_First, begin()), _Pdif(_Last, _First), _Ptr, _Count));
+ }
+
+ _Myt& replace(iterator _First, iterator _Last, const _Elem *_Ptr)
+ {
+ return (replace(
+ _Pdif(_First, begin()), _Pdif(_Last, _First), _Ptr));
+ }
+
+ _Myt& replace(iterator _First, iterator _Last,
+ size_type _Count, _Elem _Ch)
+ {
+ return (replace(
+ _Pdif(_First, begin()), _Pdif(_Last, _First), _Count, _Ch));
+ }
+
+ template<class _It>
+ _Myt& replace(iterator _First, iterator _Last,
+ _It _First2, _It _Last2)
+ {
+ return (_Replace(_First, _Last,
+ _First2, _Last2, _Iter_cat(_First2)));
+ }
+
+ template<class _It>
+ _Myt& _Replace(iterator _First, iterator _Last,
+ _It _Count, _It _Ch, _Int_iterator_tag)
+ {
+ return (replace(_First, _Last, (size_type)_Count, (_Elem)_Ch));
+ }
+
+ template<class _It>
+ _Myt& _Replace(iterator _First, iterator _Last,
+ _It _First2, _It _Last2, input_iterator_tag)
+ {
+ _Myt _Right(_First2, _Last2);
+ replace(_First, _Last, _Right);
+ return (*this);
+ }
+
+ _Myt& replace(iterator _First, iterator _Last,
+ const_pointer _First2, const_pointer _Last2)
+ {
+ if (_First2 == _Last2)
+ erase(_Pdif(_First, begin()), _Pdif(_Last, _First));
+ else
+ replace(_Pdif(_First, begin()), _Pdif(_Last, _First),
+ &*_First2, _Last2 - _First2);
+ return (*this);
+ }
+
+ _Myt& replace(iterator _First, iterator _Last,
+ const_iterator _First2, const_iterator _Last2)
+ {
+ if (_First2 == _Last2)
+ erase(_Pdif(_First, begin()), _Pdif(_Last, _First));
+ else
+ replace(_Pdif(_First, begin()), _Pdif(_Last, _First),
+ &*_First2, _Last2 - _First2);
+ return (*this);
+ }
+
+ iterator begin()
+ {
+ return (iterator(_Myptr(), this));
+ }
+
+ const_iterator begin() const
+ {
+ return (const_iterator(_Myptr(), this));
+ }
+
+ iterator end()
+ {
+ return (iterator(_Myptr() + _Mysize, this));
+ }
+
+ const_iterator end() const
+ {
+ return (const_iterator(_Myptr() + _Mysize, this));
+ }
+
+ reverse_iterator rbegin()
+ {
+ return (reverse_iterator(end()));
+ }
+
+ const_reverse_iterator rbegin() const
+ {
+ return (const_reverse_iterator(end()));
+ }
+
+ reverse_iterator rend()
+ {
+ return (reverse_iterator(begin()));
+ }
+
+ const_reverse_iterator rend() const
+ {
+ return (const_reverse_iterator(begin()));
+ }
+
+ reference at(size_type _Off)
+ {
+ if (_Mysize <= _Off)
+ _String_base::_Xran();
+ return (_Myptr()[_Off]);
+ }
+
+ const_reference at(size_type _Off) const
+ {
+ if (_Mysize <= _Off)
+ _String_base::_Xran();
+ return (_Myptr()[_Off]);
+ }
+
+
+
+ reference operator[](size_type _Off)
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+ { if (!(_Off <= _Mysize)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+
+
+ return (_Myptr()[_Off]);
+ }
+
+ const_reference operator[](size_type _Off) const
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+ { if (!(_Off <= _Mysize)) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+
+
+ return (_Myptr()[_Off]);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ void push_back(_Elem _Ch)
+ {
+ insert(end(), _Ch);
+ }
+
+ const _Elem * c_str() const
+ {
+ return (_Myptr());
+ }
+
+ const _Elem * data() const
+ {
+ return (c_str());
+ }
+
+ size_type length() const
+ {
+ return (_Mysize);
+ }
+
+ size_type size() const
+ {
+ return (_Mysize);
+ }
+
+ size_type max_size() const
+ {
+ size_type _Num = _Mybase::_Alval.max_size();
+ return (_Num <= 1 ? 1 : _Num - 1);
+ }
+
+ void resize(size_type _Newsize)
+ {
+ resize(_Newsize, _Elem());
+ }
+
+ void resize(size_type _Newsize, _Elem _Ch)
+ {
+ if (_Newsize <= _Mysize)
+ erase(_Newsize);
+ else
+ append(_Newsize - _Mysize, _Ch);
+ }
+
+ size_type capacity() const
+ {
+ return (_Myres);
+ }
+
+ void reserve(size_type _Newcap = 0)
+ {
+ if (_Mysize <= _Newcap && _Myres != _Newcap)
+ {
+ size_type _Size = _Mysize;
+ if (_Grow(_Newcap, true))
+ _Eos(_Size);
+ }
+ }
+
+ bool empty() const
+ {
+ return (_Mysize == 0);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ size_type copy(_Elem *_Dest,
+ size_type _Count, size_type _Off = 0) const
+ {
+
+ return _Copy_s(_Dest, _Count, _Count, _Off);
+ }
+
+ size_type _Copy_s(_Elem *_Dest, size_type _Dest_size,
+ size_type _Count, size_type _Off = 0) const
+ {
+ ;
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _Count)
+ _Count = _Mysize - _Off;
+ _Traits_helper::copy_s<_Traits>(_Dest, _Dest_size, _Myptr() + _Off, _Count);
+ return (_Count);
+ }
+
+ void swap(_Myt& _Right)
+ {
+ if (_Mybase::_Alval == _Right._Alval)
+ {
+
+
+
+
+
+ _Bxty _Tbx = _Bx;
+ _Bx = _Right._Bx, _Right._Bx = _Tbx;
+
+ size_type _Tlen = _Mysize;
+ _Mysize = _Right._Mysize, _Right._Mysize = _Tlen;
+
+ size_type _Tres = _Myres;
+ _Myres = _Right._Myres, _Right._Myres = _Tres;
+ }
+ else
+ {
+ _Myt _Tmp = *this; *this = _Right, _Right = _Tmp;
+ }
+ }
+
+ size_type find(const _Myt& _Right, size_type _Off = 0) const
+ {
+ return (find(_Right._Myptr(), _Off, _Right.size()));
+ }
+
+ size_type find(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (_Count == 0 && _Off <= _Mysize)
+ return (_Off);
+
+ size_type _Nm;
+ if (_Off < _Mysize && _Count <= (_Nm = _Mysize - _Off))
+ {
+ const _Elem *_Uptr, *_Vptr;
+ for (_Nm -= _Count - 1, _Vptr = _Myptr() + _Off;
+ (_Uptr = _Traits::find(_Vptr, _Nm, *_Ptr)) != 0;
+ _Nm -= _Uptr - _Vptr + 1, _Vptr = _Uptr + 1)
+ if (_Traits::compare(_Uptr, _Ptr, _Count) == 0)
+ return (_Uptr - _Myptr());
+ }
+
+ return (npos);
+ }
+
+ size_type find(const _Elem *_Ptr, size_type _Off = 0) const
+ {
+ return (find(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type find(_Elem _Ch, size_type _Off = 0) const
+ {
+ return (find((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ size_type rfind(const _Myt& _Right, size_type _Off = npos) const
+ {
+ return (rfind(_Right._Myptr(), _Off, _Right.size()));
+ }
+
+ size_type rfind(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (_Count == 0)
+ return (_Off < _Mysize ? _Off : _Mysize);
+ if (_Count <= _Mysize)
+ {
+ const _Elem *_Uptr = _Myptr() +
+ (_Off < _Mysize - _Count ? _Off : _Mysize - _Count);
+ for (; ; --_Uptr)
+ if (_Traits::eq(*_Uptr, *_Ptr)
+ && _Traits::compare(_Uptr, _Ptr, _Count) == 0)
+ return (_Uptr - _Myptr());
+ else if (_Uptr == _Myptr())
+ break;
+ }
+
+ return (npos);
+ }
+
+ size_type rfind(const _Elem *_Ptr, size_type _Off = npos) const
+ {
+ return (rfind(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type rfind(_Elem _Ch, size_type _Off = npos) const
+ {
+ return (rfind((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ size_type find_first_of(const _Myt& _Right,
+ size_type _Off = 0) const
+ {
+ return (find_first_of(_Right._Myptr(), _Off, _Right.size()));
+ }
+
+ size_type find_first_of(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (0 < _Count && _Off < _Mysize)
+ {
+ const _Elem *const _Vptr = _Myptr() + _Mysize;
+ for (const _Elem *_Uptr = _Myptr() + _Off; _Uptr < _Vptr; ++_Uptr)
+ if (_Traits::find(_Ptr, _Count, *_Uptr) != 0)
+ return (_Uptr - _Myptr());
+ }
+
+ return (npos);
+ }
+
+ size_type find_first_of(const _Elem *_Ptr, size_type _Off = 0) const
+ {
+ return (find_first_of(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type find_first_of(_Elem _Ch, size_type _Off = 0) const
+ {
+ return (find((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ size_type find_last_of(const _Myt& _Right,
+ size_type _Off = npos) const
+ {
+ return (find_last_of(_Right._Myptr(), _Off, _Right.size()));
+ }
+
+ size_type find_last_of(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (0 < _Count && 0 < _Mysize)
+ for (const _Elem *_Uptr = _Myptr()
+ + (_Off < _Mysize ? _Off : _Mysize - 1); ; --_Uptr)
+ if (_Traits::find(_Ptr, _Count, *_Uptr) != 0)
+ return (_Uptr - _Myptr());
+ else if (_Uptr == _Myptr())
+ break;
+
+ return (npos);
+ }
+
+ size_type find_last_of(const _Elem *_Ptr,
+ size_type _Off = npos) const
+ {
+ return (find_last_of(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type find_last_of(_Elem _Ch, size_type _Off = npos) const
+ {
+ return (rfind((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ size_type find_first_not_of(const _Myt& _Right,
+ size_type _Off = 0) const
+ {
+ return (find_first_not_of(_Right._Myptr(), _Off,
+ _Right.size()));
+ }
+
+ size_type find_first_not_of(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (_Off < _Mysize)
+ {
+ const _Elem *const _Vptr = _Myptr() + _Mysize;
+ for (const _Elem *_Uptr = _Myptr() + _Off; _Uptr < _Vptr; ++_Uptr)
+ if (_Traits::find(_Ptr, _Count, *_Uptr) == 0)
+ return (_Uptr - _Myptr());
+ }
+ return (npos);
+ }
+
+ size_type find_first_not_of(const _Elem *_Ptr,
+ size_type _Off = 0) const
+ {
+ return (find_first_not_of(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type find_first_not_of(_Elem _Ch, size_type _Off = 0) const
+ {
+ return (find_first_not_of((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ size_type find_last_not_of(const _Myt& _Right,
+ size_type _Off = npos) const
+ {
+ return (find_last_not_of(_Right._Myptr(), _Off, _Right.size()));
+ }
+
+ size_type find_last_not_of(const _Elem *_Ptr,
+ size_type _Off, size_type _Count) const
+ {
+ ;
+ if (0 < _Mysize)
+ for (const _Elem *_Uptr = _Myptr()
+ + (_Off < _Mysize ? _Off : _Mysize - 1); ; --_Uptr)
+ if (_Traits::find(_Ptr, _Count, *_Uptr) == 0)
+ return (_Uptr - _Myptr());
+ else if (_Uptr == _Myptr())
+ break;
+ return (npos);
+ }
+
+ size_type find_last_not_of(const _Elem *_Ptr,
+ size_type _Off = npos) const
+ {
+ return (find_last_not_of(_Ptr, _Off, _Traits::length(_Ptr)));
+ }
+
+ size_type find_last_not_of(_Elem _Ch, size_type _Off = npos) const
+ {
+ return (find_last_not_of((const _Elem *)&_Ch, _Off, 1));
+ }
+
+ _Myt substr(size_type _Off = 0, size_type _Count = npos) const
+ {
+ return (_Myt(*this, _Off, _Count));
+ }
+
+ int compare(const _Myt& _Right) const
+ {
+ return (compare(0, _Mysize, _Right._Myptr(), _Right.size()));
+ }
+
+ int compare(size_type _Off, size_type _N0,
+ const _Myt& _Right) const
+ {
+ return (compare(_Off, _N0, _Right, 0, npos));
+ }
+
+ int compare(size_type _Off,
+ size_type _N0, const _Myt& _Right,
+ size_type _Roff, size_type _Count) const
+ {
+ if (_Right.size() < _Roff)
+ _String_base::_Xran();
+ if (_Right._Mysize - _Roff < _Count)
+ _Count = _Right._Mysize - _Roff;
+ return (compare(_Off, _N0, _Right._Myptr() + _Roff, _Count));
+ }
+
+ int compare(const _Elem *_Ptr) const
+ {
+ return (compare(0, _Mysize, _Ptr, _Traits::length(_Ptr)));
+ }
+
+ int compare(size_type _Off, size_type _N0, const _Elem *_Ptr) const
+ {
+ return (compare(_Off, _N0, _Ptr, _Traits::length(_Ptr)));
+ }
+
+ int compare(size_type _Off,
+ size_type _N0, const _Elem *_Ptr, size_type _Count) const
+ {
+ ;
+ if (_Mysize < _Off)
+ _String_base::_Xran();
+ if (_Mysize - _Off < _N0)
+ _N0 = _Mysize - _Off;
+
+ size_type _Ans = _Traits::compare(_Myptr() + _Off, _Ptr,
+ _N0 < _Count ? _N0 : _Count);
+ return (_Ans != 0 ? (int)_Ans : _N0 < _Count ? -1
+ : _N0 == _Count ? 0 : +1);
+ }
+
+ allocator_type get_allocator() const
+ {
+ return (_Mybase::_Alval);
+ }
+
+ enum
+ {
+ _BUF_SIZE = 16 / sizeof (_Elem) < 1 ? 1
+ : 16 / sizeof(_Elem)};
+
+protected:
+ enum
+ {
+ _ALLOC_MASK = sizeof (_Elem) <= 1 ? 15
+ : sizeof (_Elem) <= 2 ? 7
+ : sizeof (_Elem) <= 4 ? 3
+ : sizeof (_Elem) <= 8 ? 1 : 0};
+
+ void _Chassign(size_type _Off, size_type _Count, _Elem _Ch)
+ {
+ if (_Count == 1)
+ _Traits::assign(*(_Myptr() + _Off), _Ch);
+ else
+ _Traits::assign(_Myptr() + _Off, _Count, _Ch);
+ }
+
+ void _Copy(size_type _Newsize, size_type _Oldlen)
+ {
+ size_type _Newres = _Newsize | _ALLOC_MASK;
+ if (max_size() < _Newres)
+ _Newres = _Newsize;
+ else if (_Newres / 3 < _Myres / 2
+ && _Myres <= max_size() - _Myres / 2)
+ _Newres = _Myres + _Myres / 2;
+ _Elem *_Ptr = 0;
+
+ try {
+ _Ptr = _Mybase::_Alval.allocate(_Newres + 1);
+ } catch (...) {
+ _Newres = _Newsize;
+ try {
+ _Ptr = _Mybase::_Alval.allocate(_Newres + 1);
+ } catch (...) {
+ _Tidy(true);
+ throw;
+ }
+ }
+
+ if (0 < _Oldlen)
+ _Traits_helper::copy_s<_Traits>(_Ptr, _Newres + 1, _Myptr(), _Oldlen);
+ _Tidy(true);
+ _Bx._Ptr = _Ptr;
+ _Myres = _Newres;
+ _Eos(_Oldlen);
+ }
+
+ void _Eos(size_type _Newsize)
+ {
+ _Traits::assign(_Myptr()[_Mysize = _Newsize], _Elem());
+ }
+
+ bool _Grow(size_type _Newsize,
+ bool _Trim = false)
+ {
+ if (max_size() < _Newsize)
+ _String_base::_Xlen();
+ if (_Myres < _Newsize)
+ _Copy(_Newsize, _Mysize);
+ else if (_Trim && _Newsize < _BUF_SIZE)
+ _Tidy(true,
+ _Newsize < _Mysize ? _Newsize : _Mysize);
+ else if (_Newsize == 0)
+ _Eos(0);
+ return (0 < _Newsize);
+ }
+
+ bool _Inside(const _Elem *_Ptr)
+ {
+ ;
+ if (_Ptr < _Myptr() || _Myptr() + _Mysize <= _Ptr)
+ return (false);
+ else
+ return (true);
+ }
+
+ static size_type __cdecl _Pdif(const_iterator _P2,
+ const_iterator _P1)
+ {
+ return ((_P2)._Myptr == 0 ? 0 : _P2 - _P1);
+ }
+
+ void _Tidy(bool _Built = false,
+ size_type _Newsize = 0)
+ {
+ if (!_Built)
+ ;
+ else if (_BUF_SIZE <= _Myres)
+ {
+ _Elem *_Ptr = _Bx._Ptr;
+ if (0 < _Newsize)
+ _Traits_helper::copy_s<_Traits>(_Bx._Buf, _BUF_SIZE, _Ptr, _Newsize);
+ _Mybase::_Alval.deallocate(_Ptr, _Myres + 1);
+ }
+ _Myres = _BUF_SIZE - 1;
+ _Eos(_Newsize);
+ }
+
+ union _Bxty
+ {
+ _Elem _Buf[_BUF_SIZE];
+ _Elem *_Ptr;
+ } _Bx;
+
+ _Elem * _Myptr()
+ {
+ return (_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);
+ }
+
+ const _Elem * _Myptr() const
+ {
+ return (_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);
+ }
+
+ size_type _Mysize;
+ size_type _Myres;
+ };
+
+
+template<class _Elem, class _Traits, class _Ax>
+ class _Move_operation_category<basic_string<_Elem, _Traits, _Ax> >
+ {
+ public:
+ typedef _Swap_move_tag _Move_cat;
+ };
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc>
+ const typename basic_string<_Elem, _Traits, _Alloc>::size_type
+ basic_string<_Elem, _Traits, _Alloc>::npos =
+ (typename basic_string<_Elem, _Traits, _Alloc>::size_type)(-1);
+
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ void __cdecl swap(basic_string<_Elem, _Traits, _Alloc>& _Left,
+ basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ _Left.swap(_Right);
+ }
+
+typedef basic_string<char, char_traits<char>, allocator<char> >
+ string;
+typedef basic_string<wchar_t, char_traits<wchar_t>,
+ allocator<wchar_t> > wstring;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+ #pragma warning(default: 4251)
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+class logic_error
+ : public std:: exception
+ {
+public:
+ explicit logic_error(const string& _Message)
+ : _Str(_Message)
+ {
+ }
+
+ virtual ~logic_error() throw ()
+ {
+ }
+
+ virtual const char * what() const throw ()
+ {
+ return (_Str.c_str());
+ }
+
+
+
+
+
+
+
+
+
+private:
+ string _Str;
+ };
+
+
+class domain_error
+ : public logic_error
+ {
+public:
+ explicit domain_error(const string& _Message)
+ : logic_error(_Message)
+ {
+ }
+
+ virtual ~domain_error() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class invalid_argument
+ : public logic_error
+ {
+public:
+ explicit invalid_argument(const string& _Message)
+ : logic_error(_Message)
+ {
+ }
+
+ virtual ~invalid_argument() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class length_error
+ : public logic_error
+ {
+public:
+ explicit length_error(const string& _Message)
+ : logic_error(_Message)
+ {
+ }
+
+ virtual ~length_error() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class out_of_range
+ : public logic_error
+ {
+public:
+ explicit out_of_range(const string& _Message)
+ : logic_error(_Message)
+ {
+ }
+
+ virtual ~out_of_range() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class runtime_error
+ : public std:: exception
+ {
+public:
+ explicit runtime_error(const string& _Message)
+ : _Str(_Message)
+ {
+ }
+
+ virtual ~runtime_error() throw ()
+ {
+ }
+
+ virtual const char * what() const throw ()
+ {
+ return (_Str.c_str());
+ }
+
+
+
+
+
+
+
+
+
+private:
+ string _Str;
+ };
+
+
+class overflow_error
+ : public runtime_error
+ {
+public:
+ explicit overflow_error(const string& _Message)
+ : runtime_error(_Message)
+ {
+ }
+
+ virtual ~overflow_error() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class underflow_error
+ : public runtime_error
+ {
+public:
+ explicit underflow_error(const string& _Message)
+ : runtime_error(_Message)
+ {
+ }
+
+ virtual ~underflow_error() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+class range_error
+ : public runtime_error
+ {
+public:
+ explicit range_error(const string& _Message)
+ : runtime_error(_Message)
+ {
+ }
+
+ virtual ~range_error() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+struct _DebugHeapTag_t
+ {
+ int _Type;
+ };
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl _isctype( int _C, int _Type);
+ int __cdecl _isctype_l( int _C, int _Type, _locale_t _Locale);
+ int __cdecl isalpha( int _C);
+ int __cdecl _isalpha_l( int _C, _locale_t _Locale);
+ int __cdecl isupper( int _C);
+ int __cdecl _isupper_l( int _C, _locale_t _Locale);
+ int __cdecl islower( int _C);
+ int __cdecl _islower_l( int _C, _locale_t _Locale);
+ int __cdecl isdigit( int _C);
+ int __cdecl _isdigit_l( int _C, _locale_t _Locale);
+ int __cdecl isxdigit( int _C);
+ int __cdecl _isxdigit_l( int _C, _locale_t _Locale);
+ int __cdecl isspace( int _C);
+ int __cdecl _isspace_l( int _C, _locale_t _Locale);
+ int __cdecl ispunct( int _C);
+ int __cdecl _ispunct_l( int _C, _locale_t _Locale);
+ int __cdecl isalnum( int _C);
+ int __cdecl _isalnum_l( int _C, _locale_t _Locale);
+ int __cdecl isprint( int _C);
+ int __cdecl _isprint_l( int _C, _locale_t _Locale);
+ int __cdecl isgraph( int _C);
+ int __cdecl _isgraph_l( int _C, _locale_t _Locale);
+ int __cdecl iscntrl( int _C);
+ int __cdecl _iscntrl_l( int _C, _locale_t _Locale);
+ int __cdecl toupper( int _C);
+ int __cdecl tolower( int _C);
+ int __cdecl _tolower( int _C);
+ int __cdecl _tolower_l( int _C, _locale_t _Locale);
+ int __cdecl _toupper( int _C);
+ int __cdecl _toupper_l( int _C, _locale_t _Locale);
+ int __cdecl __isascii( int _C);
+ int __cdecl __toascii( int _C);
+ int __cdecl __iscsymf( int _C);
+ int __cdecl __iscsym( int _C);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct lconv {
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int __cdecl _configthreadlocale( int _Flag);
+ char * __cdecl setlocale( int _Category, const char * _Locale);
+ struct lconv * __cdecl localeconv(void);
+ _locale_t __cdecl _get_current_locale(void);
+ _locale_t __cdecl _create_locale( int _Category, const char * _Locale);
+ void __cdecl _free_locale( _locale_t _Locale);
+
+
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "_get_current_locale" " instead. See online help for details.")) _locale_t __cdecl __get_current_locale(void);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "_create_locale" " instead. See online help for details.")) _locale_t __cdecl __create_locale( int _Category, const char * _Locale);
+__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "_free_locale" " instead. See online help for details.")) void __cdecl __free_locale( _locale_t _Locale);
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef struct _Collvec
+ {
+ unsigned long _Hand;
+ unsigned int _Page;
+ } _Collvec;
+
+typedef struct _Ctypevec
+ {
+ unsigned long _Hand;
+ unsigned int _Page;
+ const short *_Table;
+ int _Delfl;
+ } _Ctypevec;
+
+typedef struct _Cvtvec
+ {
+ unsigned long _Hand;
+ unsigned int _Page;
+ } _Cvtvec;
+
+
+ _Collvec __cdecl _Getcoll();
+ _Ctypevec __cdecl _Getctype();
+ _Cvtvec __cdecl _Getcvt();
+
+ int __cdecl _Getdateorder();
+
+ int __cdecl _Mbrtowc( wchar_t *, const char *, size_t,
+ mbstate_t *, const _Cvtvec *);
+ float __cdecl _Stof(const char *, char **, long);
+ double __cdecl _Stod(const char *, char **, long);
+ long double __cdecl _Stold(const char *, char **,
+ long);
+ int __cdecl _Strcoll(const char *, const char *,
+ const char *, const char *, const _Collvec *);
+ size_t __cdecl _Strxfrm(
+ char * _String1,
+ char * _End1, const char *, const char *, const _Collvec *);
+ int __cdecl _Tolower(int, const _Ctypevec *);
+ int __cdecl _Toupper(int, const _Ctypevec *);
+ int __cdecl _Wcrtomb( char *, wchar_t, mbstate_t *,
+ const _Cvtvec *);
+ int __cdecl _Wcscoll(const wchar_t *, const wchar_t *,
+ const wchar_t *, const wchar_t *, const _Collvec *);
+ size_t __cdecl _Wcsxfrm(
+ wchar_t *_String1,
+ wchar_t *_End1, const wchar_t *, const wchar_t *, const _Collvec *);
+
+ short __cdecl _Getwctype(wchar_t, const _Ctypevec *);
+ const wchar_t * __cdecl _Getwctypes(const wchar_t *, const wchar_t *,
+ short*, const _Ctypevec*);
+ wchar_t __cdecl _Towlower(wchar_t, const _Ctypevec *);
+ wchar_t __cdecl _Towupper(wchar_t, const _Ctypevec *);
+
+}
+
+
+
+extern "C" {
+ void *__cdecl _Gettnames();
+ char *__cdecl _Getdays();
+ char *__cdecl _Getmonths();
+ size_t __cdecl _Strftime(
+ char *, size_t _Maxsize,
+ const char *, const struct tm *, void *);
+}
+
+extern "C" {
+_locale_t __cdecl _GetLocaleForCP(unsigned int);
+}
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+#pragma warning(disable:4412)
+
+
+namespace std {
+
+
+class _Timevec
+ {
+public:
+ _Timevec(void *_Ptr = 0)
+ : _Timeptr(_Ptr)
+ {
+ }
+
+ _Timevec(const _Timevec& _Right)
+ {
+ *this = _Right;
+ }
+
+ ~_Timevec()
+ {
+ free(_Timeptr);
+ }
+
+ _Timevec& operator=(const _Timevec& _Right)
+ {
+ _Timeptr = _Right._Timeptr;
+ ((_Timevec *)&_Right)->_Timeptr = 0;
+ return (*this);
+ }
+
+ void * _Getptr() const
+ {
+ return (_Timeptr);
+ }
+
+private:
+ void *_Timeptr;
+ };
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4412)
+class _Locinfo
+ {
+public:
+ typedef ::_Collvec _Collvec;
+ typedef ::_Ctypevec _Ctypevec;
+ typedef ::_Cvtvec _Cvtvec;
+ typedef std::_Timevec _Timevec;
+
+ static void __cdecl _Locinfo_ctor(_Locinfo *, const char *);
+ static void __cdecl _Locinfo_ctor(_Locinfo *, int, const char *);
+ static void __cdecl _Locinfo_dtor(_Locinfo *);
+ static _Locinfo& __cdecl _Locinfo_Addcats(_Locinfo *, int, const char *);
+
+ _Locinfo(const char *_Pch = "C")
+
+ : _Lock(0)
+
+ {
+ if (_Pch == 0)
+ throw runtime_error("bad locale name");
+ _Locinfo_ctor(this, _Pch);
+ }
+
+ _Locinfo(int _I, const char *_Pch)
+
+ : _Lock(0)
+
+ {
+ if (_Pch == 0)
+ throw runtime_error("bad locale name");
+ _Locinfo_ctor(this, _I, _Pch);
+ }
+
+ ~_Locinfo()
+ {
+ _Locinfo_dtor(this);
+ }
+
+ _Locinfo& _Addcats(int _I, const char *_Pch)
+ {
+ if (_Pch == 0)
+ throw runtime_error("bad locale name");
+ return _Locinfo_Addcats(this, _I, _Pch);
+ }
+
+ string _Getname() const
+ {
+ return (_Newlocname);
+ }
+
+ _Collvec _Getcoll() const
+ {
+ return (::_Getcoll());
+ }
+
+ _Ctypevec _Getctype() const
+ {
+ return (::_Getctype());
+ }
+
+ _Cvtvec _Getcvt() const
+ {
+ return (::_Getcvt());
+ }
+
+ const lconv * _Getlconv() const
+ {
+ return (localeconv());
+ }
+
+ _Timevec _Gettnames() const
+ {
+ return (_Timevec(::_Gettnames()));
+ }
+
+ const char * _Getdays() const
+ {
+ const char *_Ptr = ::_Getdays();
+ if (_Ptr != 0)
+ {
+ ((_Locinfo *)this)->_Days = _Ptr;
+ free((void *)_Ptr);
+ }
+ return (_Days.size() != 0 ? _Days.c_str()
+ : ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday"
+ ":Thu:Thursday:Fri:Friday:Sat:Saturday");
+ }
+
+ const char * _Getmonths() const
+ {
+ const char *_Ptr = ::_Getmonths();
+ if (_Ptr != 0)
+ {
+ ((_Locinfo *)this)->_Months = _Ptr;
+ free((void *)_Ptr);
+ }
+ return (_Months.size() != 0 ? _Months.c_str()
+ : ":Jan:January:Feb:February:Mar:March"
+ ":Apr:April:May:May:Jun:June"
+ ":Jul:July:Aug:August:Sep:September"
+ ":Oct:October:Nov:November:Dec:December");
+ }
+
+ const char * _Getfalse() const
+ {
+ return ("false");
+ }
+
+ const char * _Gettrue() const
+ {
+ return ("true");
+ }
+
+ int _Getdateorder() const
+ {
+ return ::_Getdateorder();
+ }
+
+private:
+
+
+
+
+
+ _Lockit _Lock;
+
+ string _Days;
+ string _Months;
+ string _Oldlocname;
+ string _Newlocname;
+ };
+#pragma warning(pop)
+
+
+template<class _Elem> inline
+ int __cdecl _LStrcoll(const _Elem *_First1, const _Elem *_Last1,
+ const _Elem *_First2, const _Elem *_Last2,
+ const _Locinfo::_Collvec *)
+ {
+ for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, ++_First2)
+ if (*_First1 < *_First2)
+ return (-1);
+ else if (*_First2 < *_First1)
+ return (+1);
+ return (_First2 != _Last2 ? -1 : _First1 != _Last1 ? +1 : 0);
+ }
+
+template<> inline
+ int __cdecl _LStrcoll(const char *_First1, const char *_Last1,
+ const char *_First2, const char *_Last2,
+ const _Locinfo::_Collvec *_Vector)
+ {
+ return (_Strcoll(_First1, _Last1, _First2, _Last2, _Vector));
+ }
+
+template<> inline
+ int __cdecl _LStrcoll(const wchar_t *_First1, const wchar_t *_Last1,
+ const wchar_t *_First2, const wchar_t *_Last2,
+ const _Locinfo::_Collvec *_Vector)
+ {
+ return (_Wcscoll(_First1, _Last1, _First2, _Last2, _Vector));
+ }
+
+
+template<class _Elem> inline
+ size_t __cdecl _LStrxfrm(_Elem *_First1, _Elem *_Last1,
+ const _Elem *_First2, const _Elem *_Last2,
+ const _Locinfo::_Collvec *)
+ {
+ size_t _Count = _Last2 - _First2;
+ if (_Count <= (size_t)(_Last1 - _First1))
+ ::memcpy_s((_First1), ((_Last1 - _First1)* sizeof(_Elem)), (_First2), (_Count * sizeof (_Elem)));
+ return (_Count);
+ }
+
+template<> inline
+ size_t __cdecl _LStrxfrm(
+ char *_First1,
+ char *_Last1,
+ const char *_First2, const char *_Last2,
+ const _Locinfo::_Collvec *_Vector)
+ {
+ return (_Strxfrm(_First1, _Last1, _First2, _Last2, _Vector));
+ }
+
+template<> inline
+ size_t __cdecl _LStrxfrm(
+ wchar_t *_First1,
+ wchar_t *_Last1,
+ const wchar_t *_First2, const wchar_t *_Last2,
+ const _Locinfo::_Collvec *_Vector)
+ {
+ return (_Wcsxfrm(_First1, _Last1, _First2, _Last2, _Vector));
+ }
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+#pragma warning(disable:4412)
+
+
+namespace std {
+
+
+template<class _Dummy>
+ class _Locbase
+ {
+public:
+ static const int collate = ((1 << (1)) >> 1);
+ static const int ctype = ((1 << (2)) >> 1);
+ static const int monetary = ((1 << (3)) >> 1);
+ static const int numeric = ((1 << (4)) >> 1);
+ static const int time = ((1 << (5)) >> 1);
+ static const int messages = ((1 << (6)) >> 1);
+ static const int all = (((1 << (7)) >> 1) - 1);
+ static const int none = 0;
+ };
+
+template<class _Dummy>
+ const int _Locbase<_Dummy>::collate;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::ctype;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::monetary;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::numeric;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::time;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::messages;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::all;
+template<class _Dummy>
+ const int _Locbase<_Dummy>::none;
+
+
+class locale;
+template<class _Facet>
+ const _Facet& __cdecl use_facet(const locale&);
+
+
+#pragma warning(push)
+#pragma warning(disable:4412)
+class locale
+ : public _Locbase<int>
+ {
+public:
+ typedef int category;
+
+
+ class id
+ {
+ public:
+ id(size_t _Val = 0)
+ : _Id(_Val)
+ {
+ }
+
+ operator size_t()
+ {
+ if (_Id == 0)
+ {
+ { ::std:: _Lockit _Lock(0);
+ if (_Id == 0)
+ _Id = ++_Id_cnt;
+ }
+ }
+ return (_Id);
+ }
+
+ private:
+ id(const id&);
+ id& operator=(const id&);
+
+ size_t _Id;
+ static int& __cdecl _Id_cnt_func();
+
+
+
+ static int _Id_cnt;
+
+ };
+
+ class _Locimp;
+
+
+ class facet
+ {
+ friend class locale;
+ friend class _Locimp;
+
+ public:
+ static size_t __cdecl _Getcat(const facet ** = 0)
+ {
+ return ((size_t)(-1));
+ }
+
+ void _Incref()
+ {
+ { ::std:: _Lockit _Lock(0);
+ if (_Refs < (size_t)(-1))
+ ++_Refs;
+ }
+ }
+
+ facet * _Decref()
+ {
+ { ::std:: _Lockit _Lock(0);
+ if (0 < _Refs && _Refs < (size_t)(-1))
+ --_Refs;
+ return (_Refs == 0 ? this : 0);
+ }
+ }
+
+ void _Register()
+ {
+ facet_Register(this);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ virtual ~facet()
+ {
+ }
+
+ protected:
+ explicit facet(size_t _Initrefs = 0)
+ : _Refs(_Initrefs)
+ {
+ }
+
+ private:
+ static void __cdecl facet_Register(facet *);
+
+ facet(const facet&);
+ facet& operator=(const facet&);
+
+ size_t _Refs;
+ };
+
+
+ class _Locimp
+ : public facet
+ {
+ protected:
+ ~_Locimp()
+ {
+ _Locimp_dtor(this);
+ }
+
+ private:
+ static void __cdecl _Locimp_dtor(_Locimp *);
+ static void __cdecl _Locimp_ctor(_Locimp *,const _Locimp&);
+ static void __cdecl _Locimp_Addfac(_Locimp *,facet *, size_t);
+ friend class locale;
+
+ _Locimp(bool _Transparent = false)
+ : locale::facet(1), _Facetvec(0), _Facetcount(0),
+ _Catmask(none), _Xparent(_Transparent), _Name("*")
+ { }
+
+ _Locimp(const _Locimp& _Right)
+ : locale::facet(1), _Facetvec(0), _Facetcount(_Right._Facetcount),
+ _Catmask(_Right._Catmask), _Xparent(_Right._Xparent), _Name(_Right._Name)
+ {
+ _Locimp_ctor(this, _Right);
+ }
+
+ void _Addfac(facet *_Pfacet, size_t _Id)
+ {
+ _Locimp_Addfac(this, _Pfacet, _Id);
+ }
+
+ static _Locimp *__cdecl _Makeloc(const _Locinfo&,
+ category, _Locimp *, const locale *);
+
+ static void __cdecl _Makewloc(const _Locinfo&,
+ category, _Locimp *, const locale *);
+
+
+ static void __cdecl _Makeushloc(const _Locinfo&,
+ category, _Locimp *, const locale *);
+
+
+ static void __cdecl _Makexloc(const _Locinfo&,
+ category, _Locimp *, const locale *);
+
+ facet **_Facetvec;
+ size_t _Facetcount;
+ category _Catmask;
+ bool _Xparent;
+ string _Name;
+
+ static _Locimp *& __cdecl _Clocptr_func();
+
+
+
+ static _Locimp *_Clocptr;
+
+private:
+ _Locimp& operator=(const _Locimp&);
+
+ };
+
+ __declspec(deprecated("This is an obsolete part of the Standard C++ Library Implementation. Do not use it.")) locale& _Addfac(facet *_Fac, size_t _Id,
+ size_t _Catmask)
+ {
+ if (1 < this->_Ptr->_Refs)
+ {
+ this->_Ptr->_Decref();
+ this->_Ptr = new _Locimp(*this->_Ptr);
+ }
+ this->_Ptr->_Addfac(_Fac, _Id);
+
+ if (_Catmask != 0)
+ this->_Ptr->_Name = "*";
+ return (*this);
+ }
+
+ template<class _Elem,
+ class _Traits,
+ class _Alloc>
+ bool operator()(const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right) const
+ {
+ const std::collate<_Elem>& _Coll_fac =
+ std::use_facet<std::collate<_Elem> >(*this);
+
+ return (_Coll_fac.compare(_Left.c_str(), _Left.c_str() + _Left.size(),
+ _Right.c_str(), _Right.c_str() + _Right.size()) < 0);
+ }
+
+ template<class _Facet>
+ locale combine(const locale& _Loc) const
+ {
+ _Facet *_Facptr;
+
+ try {
+ _Facptr = (_Facet *)&std::use_facet<_Facet>(_Loc);
+ } catch (...) {
+ throw runtime_error("locale::combine facet missing");
+ }
+
+ _Locimp *_Newimp = new _Locimp(*_Ptr);
+ _Newimp->_Addfac(_Facptr, _Facet::id);
+ _Newimp->_Catmask = 0;
+ _Newimp->_Name = "*";
+ return (locale(_Newimp));
+ }
+
+ template<class _Facet>
+ locale(const locale& _Loc, const _Facet *_Facptr)
+ : _Ptr(new _Locimp(*_Loc._Ptr))
+ {
+ if (_Facptr != 0)
+ {
+ _Ptr->_Addfac((_Facet *)_Facptr, _Facet::id);
+ if (_Facet::_Getcat() != (size_t)(-1))
+ _Ptr->_Catmask = 0, _Ptr->_Name = "*";
+ }
+ }
+
+
+ locale() throw ()
+ : _Ptr(_Init())
+ {
+ _Getgloballocale()->_Incref();
+ }
+
+ locale(_Uninitialized)
+ {
+ }
+
+ locale(const locale& _Right) throw ()
+ : _Ptr(_Right._Ptr)
+ {
+ _Ptr->_Incref();
+ }
+
+ locale(const locale& _Loc, const locale& _Other,
+ category _Cat)
+ : _Ptr(new _Locimp(*_Loc._Ptr))
+ {
+ try {
+ { _Locinfo _Lobj(_Loc._Ptr->_Catmask, _Loc._Ptr->_Name.c_str());
+ _Locimp::_Makeloc(_Lobj._Addcats(_Cat & _Other._Ptr->_Catmask,
+ _Other._Ptr->_Name.c_str()), _Cat, _Ptr, &_Other);
+ }
+ } catch (...) {
+ delete (_Ptr->_Decref());
+ throw;
+ }
+ }
+
+ explicit locale(const char *_Locname,
+ category _Cat = all)
+ : _Ptr(new _Locimp)
+ {
+ try {
+ _Init();
+ { _Locinfo _Lobj(_Cat, _Locname);
+ if (_Lobj._Getname().compare("*") == 0)
+ throw runtime_error("bad locale name");
+ _Locimp::_Makeloc(_Lobj, _Cat, _Ptr, 0);
+ }
+ } catch (...) {
+ delete (_Ptr->_Decref());
+ throw;
+ }
+ }
+
+ locale(const locale& _Loc, const char * _Locname,
+ category _Cat)
+ : _Ptr(new _Locimp(*_Loc._Ptr))
+ {
+ try {
+ { _Locinfo _Lobj(_Loc._Ptr->_Catmask, _Loc._Ptr->_Name.c_str());
+ bool _Hadname = _Lobj._Getname().compare("*") != 0;
+ _Lobj._Addcats(_Cat, _Locname);
+
+ if (_Hadname && _Lobj._Getname().compare("*") == 0)
+ throw runtime_error("bad locale name");
+ _Locimp::_Makeloc(_Lobj, _Cat, _Ptr, 0);
+ }
+ } catch (...) {
+ delete (_Ptr->_Decref());
+ throw;
+ }
+ }
+
+ ~locale() throw ()
+ {
+ if (_Ptr != 0)
+ delete (_Ptr->_Decref());
+ }
+
+ locale& operator=(const locale& _Right) throw ()
+ {
+ if (_Ptr != _Right._Ptr)
+ {
+ delete (_Ptr->_Decref());
+ _Ptr = _Right._Ptr;
+ _Ptr->_Incref();
+ }
+ return (*this);
+ }
+
+ string name() const
+ {
+ return (_Ptr->_Name);
+ }
+
+ const facet * _Getfacet(size_t _Id) const
+ {
+ const facet *_Facptr = _Id < _Ptr->_Facetcount
+ ? _Ptr->_Facetvec[_Id] : 0;
+ if (_Facptr != 0 || !_Ptr->_Xparent)
+ return (_Facptr);
+ else
+ {
+ locale::_Locimp *_Ptr = _Getgloballocale();
+ return (_Id < _Ptr->_Facetcount
+ ? _Ptr->_Facetvec[_Id]
+ : 0);
+ }
+ }
+
+
+ bool operator==(const locale& _Loc) const
+ {
+ return (_Ptr == _Loc._Ptr
+ || name().compare("*") != 0 && name().compare(_Loc.name()) == 0);
+ }
+
+ bool operator!=(const locale& _Right) const
+ {
+ return (!(*this == _Right));
+ }
+
+ static const locale& __cdecl classic();
+
+ static locale __cdecl global(const locale&);
+
+ static locale __cdecl empty();
+
+private:
+ locale(_Locimp *_Ptrimp)
+ : _Ptr(_Ptrimp)
+ {
+ }
+
+ static _Locimp *__cdecl _Getgloballocale();
+ static _Locimp *__cdecl _Init();
+ static void __cdecl _Setgloballocale(void *);
+
+ _Locimp *_Ptr;
+ };
+#pragma warning(pop)
+
+
+template<class _Facet>
+ struct _Facetptr
+ {
+ static const locale::facet *_Psave;
+ };
+
+template<class _Facet>
+ const locale::facet *_Facetptr<_Facet>::_Psave = 0;
+
+template<class _Facet> inline __declspec(deprecated("This is an obsolete part of the Standard C++ Library Implementation. Do not use it."))
+ locale _Addfac(locale _Loc, const _Facet *_Facptr)
+ {
+ return (_Loc._Addfac((_Facet *)_Facptr, _Facet::id,
+ _Facet::_Getcat()));
+ }
+
+
+
+
+
+
+template<class _Facet> inline
+ const _Facet& __cdecl use_facet(const locale& _Loc)
+ {
+ { ::std:: _Lockit _Lock(0);
+ const locale::facet *_Psave =
+ _Facetptr<_Facet>::_Psave;
+
+ size_t _Id = _Facet::id;
+ const locale::facet *_Pf = _Loc._Getfacet(_Id);
+
+ if (_Pf != 0)
+ ;
+ else if (_Psave != 0)
+ _Pf = _Psave;
+ else if (_Facet::_Getcat(&_Psave) == (size_t)(-1))
+
+
+ throw bad_cast();
+
+
+
+
+
+ else
+ {
+ _Pf = _Psave;
+ _Facetptr<_Facet>::_Psave = _Psave;
+
+ locale::facet *_Pfmod = (_Facet *)_Psave;
+ _Pfmod->_Incref();
+ _Pfmod->_Register();
+ }
+
+ return ((const _Facet&)(*_Pf));
+ }
+ }
+
+template<class _Facet> inline __declspec(deprecated("This is an obsolete part of the Standard C++ Library Implementation. Do not use it."))
+ const _Facet& __cdecl use_facet(const locale& _Loc, const _Facet *,
+ bool = false)
+ {
+ return use_facet<_Facet>(_Loc);
+ }
+
+
+template<class _Elem,
+ class _InIt> inline
+ int __cdecl _Getloctxt(_InIt& _First, _InIt& _Last, size_t _Numfields,
+ const _Elem *_Ptr)
+ {
+ for (size_t _Off = 0; _Ptr[_Off] != (_Elem)0; ++_Off)
+ if (_Ptr[_Off] == _Ptr[0])
+ ++_Numfields;
+ string _Str(_Numfields, '\0');
+
+ int _Ans = -2;
+ for (size_t _Column = 1; ; ++_Column, ++_First, _Ans = -1)
+ {
+ bool _Prefix = false;
+ size_t _Off = 0;
+ size_t _Field = 0;
+
+ for (; _Field < _Numfields; ++_Field)
+ {
+ for (; _Ptr[_Off] != (_Elem)0 && _Ptr[_Off] != _Ptr[0]; ++_Off)
+ ;
+
+ if (_Str[_Field] != '\0')
+ _Off += _Str[_Field];
+ else if (_Ptr[_Off += _Column] == _Ptr[0]
+ || _Ptr[_Off] == (_Elem)0)
+ {
+ _Str[_Field] = (char)(_Column < 127
+ ? _Column : 127);
+ _Ans = (int)_Field;
+ }
+ else if (_First == _Last || _Ptr[_Off] != *_First)
+ _Str[_Field] = (char)(_Column < 127
+ ? _Column : 127);
+ else
+ _Prefix = true;
+ }
+
+ if (!_Prefix || _First == _Last)
+ break;
+ }
+ return (_Ans);
+ }
+
+
+
+
+
+template<class _Elem> inline
+ char __cdecl _Maklocbyte(_Elem _Char,
+ const _Locinfo::_Cvtvec&)
+ {
+ return ((char)(unsigned char)_Char);
+ }
+
+template<> inline
+ char __cdecl _Maklocbyte(wchar_t _Char,
+ const _Locinfo::_Cvtvec& _Cvt)
+ {
+ char _Byte = '\0';
+ mbstate_t _Mbst1 = {0};
+ _Wcrtomb(&_Byte, _Char, &_Mbst1, &_Cvt);
+ return (_Byte);
+ }
+
+
+
+
+
+
+template<class _Elem> inline
+ _Elem __cdecl _Maklocchr(char _Byte, _Elem *,
+ const _Locinfo::_Cvtvec&)
+ {
+ return ((_Elem)(unsigned char)_Byte);
+ }
+
+template<> inline
+ wchar_t __cdecl _Maklocchr(char _Byte, wchar_t *,
+ const _Locinfo::_Cvtvec& _Cvt)
+ {
+ wchar_t _Wc = L'\0';
+ mbstate_t _Mbst1 = {0};
+ _Mbrtowc(&_Wc, &_Byte, 1, &_Mbst1, &_Cvt);
+ return (_Wc);
+ }
+
+
+
+
+
+
+template<class _Elem> inline
+ _Elem *__cdecl _Maklocstr(const char *_Ptr, _Elem *,
+ const _Locinfo::_Cvtvec&)
+ {
+ size_t _Count = ::strlen(_Ptr) + 1;
+ _Elem *_Ptrdest = new _Elem[_Count];
+
+#pragma warning(push)
+#pragma warning(disable: 6011)
+
+ for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)
+ *_Ptrnext = (_Elem)(unsigned char)*_Ptr;
+ return (_Ptrdest);
+#pragma warning(pop)
+ }
+
+template<> inline
+ wchar_t *__cdecl _Maklocstr(const char *_Ptr, wchar_t *,
+ const _Locinfo::_Cvtvec& _Cvt)
+ {
+ size_t _Count, _Count1;
+ size_t _Wchars;
+ const char *_Ptr1;
+ int _Bytes;
+ wchar_t _Wc;
+ mbstate_t _Mbst1 = {0};
+
+ _Count1 = ::strlen(_Ptr) + 1;
+ for (_Count = _Count1, _Wchars = 0, _Ptr1 = _Ptr; 0 < _Count;
+ _Count -= _Bytes, _Ptr1 += _Bytes, ++_Wchars)
+ if ((_Bytes = _Mbrtowc(&_Wc, _Ptr1, _Count, &_Mbst1, &_Cvt)) <= 0)
+ break;
+ ++_Wchars;
+
+ wchar_t *_Ptrdest = new wchar_t[_Wchars];
+ wchar_t *_Ptrnext = _Ptrdest;
+ mbstate_t _Mbst2 = {0};
+#pragma warning(push)
+#pragma warning(disable: 6011)
+
+ for (; 0 < _Wchars;
+ _Count -= _Bytes, _Ptr += _Bytes, --_Wchars, ++_Ptrnext)
+ if ((_Bytes = _Mbrtowc(_Ptrnext, _Ptr, _Count1, &_Mbst2, &_Cvt)) <= 0)
+ break;
+ *_Ptrnext = L'\0';
+#pragma warning(pop)
+ return (_Ptrdest);
+ }
+
+
+
+class codecvt_base
+ : public locale::facet
+ {
+public:
+ enum
+ {
+ ok, partial, error, noconv};
+ typedef int result;
+
+ codecvt_base(size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ }
+
+ bool always_noconv() const throw ()
+ {
+ return (do_always_noconv());
+ }
+
+ int max_length() const throw ()
+ {
+ return (do_max_length());
+ }
+
+ int encoding() const throw ()
+ {
+ return (do_encoding());
+ }
+
+ ~codecvt_base()
+ {
+ }
+
+protected:
+ virtual bool do_always_noconv() const throw ()
+ {
+ return (true);
+ }
+
+ virtual int do_max_length() const throw ()
+ {
+ return (1);
+ }
+
+ virtual int do_encoding() const throw ()
+ {
+ return (1);
+ }
+ };
+
+
+template<class _Elem,
+ class _Byte,
+ class _Statype>
+ class codecvt
+ : public codecvt_base
+ {
+public:
+ typedef _Elem intern_type;
+ typedef _Byte extern_type;
+ typedef _Statype state_type;
+
+ result in(_Statype& _State,
+ const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
+ {
+ return (do_in(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result out(_Statype& _State,
+ const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_out(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result unshift(_Statype& _State,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_unshift(_State, _First2, _Last2, _Mid2));
+ }
+
+ int length(const _Statype& _State, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ return (do_length(_State, _First1, _Last1, _Count));
+ }
+
+ static locale::id id;
+
+ explicit codecvt(size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ codecvt(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new codecvt<_Elem, _Byte, _Statype>;
+ return (2);
+ }
+
+protected:
+ virtual ~codecvt()
+ {
+ }
+
+protected:
+ void _Init(const _Locinfo&)
+ {
+ }
+
+ virtual result do_in(_Statype&,
+ const _Byte *_First1, const _Byte *, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *, _Elem *& _Mid2) const
+ {
+ _Mid1 = _First1, _Mid2 = _First2;
+ return (noconv);
+ }
+
+ virtual result do_out(_Statype&,
+ const _Elem *_First1, const _Elem *, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *, _Byte *& _Mid2) const
+ {
+ _Mid1 = _First1, _Mid2 = _First2;
+ return (noconv);
+ }
+
+ virtual result do_unshift(_Statype&,
+ _Byte *_First2, _Byte *, _Byte *&_Mid2) const
+ {
+ _Mid2 = _First2;
+ return (noconv);
+ }
+
+ virtual int do_length(const _Statype&, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ return ((int)(_Count < (size_t)(_Last1 - _First1)
+ ? _Count : _Last1 - _First1));
+ }
+ };
+
+
+template<class _Elem,
+ class _Byte,
+ class _Statype>
+ locale::id codecvt<_Elem, _Byte, _Statype>::id;
+
+
+template<> class codecvt<wchar_t, char, _Mbstatet>
+ : public codecvt_base
+ {
+public:
+ typedef wchar_t _Elem;
+ typedef char _Byte;
+ typedef _Mbstatet _Statype;
+ typedef _Elem intern_type;
+ typedef _Byte extern_type;
+ typedef _Statype state_type;
+
+ result in(_Statype& _State,
+ const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
+ {
+ return (do_in(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result out(_Statype& _State,
+ const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_out(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result unshift(_Statype& _State,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_unshift(_State,
+ _First2, _Last2, _Mid2));
+ }
+
+ int length(const _Statype& _State, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ return (do_length(_State, _First1, _Last1, _Count));
+ }
+
+ static locale::id& __cdecl _Id_func();
+
+
+
+ static locale::id id;
+
+
+ explicit codecvt(size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ codecvt(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new codecvt<_Elem, _Byte, _Statype>;
+ return (2);
+ }
+
+protected:
+ virtual ~codecvt()
+ {
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ virtual result do_in(_Statype& _State,
+ const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
+ {
+ ;
+ ;
+ _Mid1 = _First1, _Mid2 = _First2;
+ result _Ans = _Mid1 == _Last1 ? ok : partial;
+ int _Bytes;
+
+ while (_Mid1 != _Last1 && _Mid2 != _Last2)
+ switch (_Bytes = _Mbrtowc(_Mid2, _Mid1, _Last1 - _Mid1,
+ &_State, &_Cvt))
+ {
+ case -2:
+ _Mid1 = _Last1;
+ return (_Ans);
+
+ case -1:
+ return (error);
+
+ case 0:
+ if (*_Mid2 == (_Elem)0)
+ _Bytes = (int)::strlen(_Mid1) + 1;
+
+
+ default:
+ if (_Bytes == -3)
+ _Bytes = 0;
+ _Mid1 += _Bytes;
+ ++_Mid2;
+ _Ans = ok;
+ }
+ return (_Ans);
+ }
+
+ virtual result do_out(_Statype& _State,
+ const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ ;
+ ;
+ _Mid1 = _First1, _Mid2 = _First2;
+ result _Ans = _Mid1 == _Last1 ? ok : partial;
+ int _Bytes;
+
+ while (_Mid1 != _Last1 && _Mid2 != _Last2)
+ if (5 <= _Last2 - _Mid2)
+ if ((_Bytes = _Wcrtomb(_Mid2, *_Mid1,
+ &_State, &_Cvt)) < 0)
+ return (error);
+ else
+ ++_Mid1, _Mid2 += _Bytes, _Ans = ok;
+ else
+ {
+ _Byte _Buf[5];
+ _Statype _Stsave = _State;
+
+ if ((_Bytes = _Wcrtomb(_Buf, *_Mid1,
+ &_State, &_Cvt)) < 0)
+ return (error);
+ else if (_Last2 - _Mid2 < _Bytes)
+ {
+ _State = _Stsave;
+ return (_Ans);
+ }
+ else
+ {
+ ::memcpy_s((_Mid2), (_Last2 - _Mid2), (_Buf), (_Bytes));
+ ++_Mid1, _Mid2 += _Bytes, _Ans = ok;
+ }
+ }
+ return (_Ans);
+ }
+
+ virtual result do_unshift(_Statype& _State,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ ;
+ _Mid2 = _First2;
+ result _Ans = ok;
+ int _Bytes;
+ _Byte _Buf[5];
+ _Statype _Stsave = _State;
+
+ if ((_Bytes = _Wcrtomb(_Buf, L'\0', &_State, &_Cvt)) <= 0)
+ _Ans = error;
+ else if (_Last2 - _Mid2 < --_Bytes)
+ {
+ _State = _Stsave;
+ _Ans = partial;
+ }
+ else if (0 < _Bytes)
+ {
+ ::memcpy_s((_Mid2), (_Last2 - _Mid2), (_Buf), (_Bytes));
+ _Mid2 += _Bytes;
+ }
+ return (_Ans);
+ }
+
+ virtual int do_length(const _Statype& _State, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ ;
+ int _Wchars;
+ const _Byte *_Mid1;
+ _Statype _Mystate = _State;
+
+ for (_Wchars = 0, _Mid1 = _First1;
+ (size_t)_Wchars < _Count && _Mid1 != _Last1; )
+ {
+ int _Bytes;
+ _Elem _Ch;
+
+ switch (_Bytes = _Mbrtowc(&_Ch, _Mid1, _Last1 - _Mid1,
+ &_Mystate, &_Cvt))
+ {
+ case -2:
+ return (_Wchars);
+
+ case -1:
+ return (_Wchars);
+
+ case 0:
+ if (_Ch == (_Elem)0)
+ _Bytes = (int)::strlen(_Mid1) + 1;
+
+
+ default:
+ if (_Bytes == -3)
+ _Bytes = 0;
+ _Mid1 += _Bytes;
+ ++_Wchars;
+ }
+ }
+ return (_Wchars);
+ }
+
+ virtual bool do_always_noconv() const throw ()
+ {
+ return (false);
+ }
+
+ virtual int do_max_length() const throw ()
+ {
+ return (5);
+ }
+
+ virtual int do_encoding() const throw ()
+ {
+ return (0);
+ }
+
+private:
+ _Locinfo::_Cvtvec _Cvt;
+ };
+
+
+
+template<> class codecvt<unsigned short, char, _Mbstatet>
+ : public codecvt_base
+ {
+public:
+ typedef unsigned short _Elem;
+ typedef char _Byte;
+ typedef _Mbstatet _Statype;
+ typedef _Elem intern_type;
+ typedef _Byte extern_type;
+ typedef _Statype state_type;
+
+ result in(_Statype& _State,
+ const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
+ {
+ return (do_in(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result out(_Statype& _State,
+ const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_out(_State,
+ _First1, _Last1, _Mid1, _First2, _Last2, _Mid2));
+ }
+
+ result unshift(_Statype& _State,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ return (do_unshift(_State,
+ _First2, _Last2, _Mid2));
+ }
+
+ int length(const _Statype& _State, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ return (do_length(_State, _First1, _Last1, _Count));
+ }
+
+ static locale::id& __cdecl _Id_func();
+
+
+
+ static locale::id id;
+
+
+ explicit codecvt(size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ codecvt(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new codecvt<_Elem, _Byte, _Statype>;
+ return (2);
+ }
+
+protected:
+ virtual ~codecvt()
+ {
+ }
+
+protected:
+ codecvt(const char *_Locname, size_t _Refs = 0)
+ : codecvt_base(_Refs)
+ {
+ { _Locinfo _Lobj(_Locname);
+ _Init(_Lobj);
+ }
+ }
+
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ virtual result do_in(_Statype& _State,
+ const _Byte *_First1, const _Byte *_Last1, const _Byte *& _Mid1,
+ _Elem *_First2, _Elem *_Last2, _Elem *& _Mid2) const
+ {
+ ;
+ ;
+ _Mid1 = _First1, _Mid2 = _First2;
+ result _Ans = _Mid1 == _Last1 ? ok : partial;
+ int _Bytes;
+
+ while (_Mid1 != _Last1 && _Mid2 != _Last2)
+ switch (_Bytes = _Mbrtowc((wchar_t *)_Mid2, _Mid1, _Last1 - _Mid1,
+ &_State, &_Cvt))
+ {
+ case -2:
+ _Mid1 = _Last1;
+ return (_Ans);
+
+ case -1:
+ return (error);
+
+ case 0:
+ if (*_Mid2 == (_Elem)0)
+ _Bytes = (int)::strlen(_Mid1) + 1;
+
+
+ default:
+ if (_Bytes == -3)
+ _Bytes = 0;
+ _Mid1 += _Bytes;
+ ++_Mid2;
+ _Ans = ok;
+ }
+ return (_Ans);
+ }
+
+ virtual result do_out(_Statype& _State,
+ const _Elem *_First1, const _Elem *_Last1, const _Elem *& _Mid1,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ ;
+ ;
+ _Mid1 = _First1, _Mid2 = _First2;
+ result _Ans = _Mid1 == _Last1 ? ok : partial;
+ int _Bytes;
+
+ while (_Mid1 != _Last1 && _Mid2 != _Last2)
+ if (5 <= _Last2 - _Mid2)
+ if ((_Bytes = _Wcrtomb(_Mid2, *_Mid1,
+ &_State, &_Cvt)) < 0)
+ return (error);
+ else
+ ++_Mid1, _Mid2 += _Bytes, _Ans = ok;
+ else
+ {
+ _Byte _Buf[5];
+ _Statype _Stsave = _State;
+
+ if ((_Bytes = _Wcrtomb(_Buf, *_Mid1,
+ &_State, &_Cvt)) < 0)
+ return (error);
+ else if (_Last2 - _Mid2 < _Bytes)
+ {
+ _State = _Stsave;
+ return (_Ans);
+ }
+ else
+ {
+ ::memcpy_s((_Mid2), (_Last2 - _Mid2), (_Buf), (_Bytes));
+ ++_Mid1, _Mid2 += _Bytes, _Ans = ok;
+ }
+ }
+ return (_Ans);
+ }
+
+ virtual result do_unshift(_Statype& _State,
+ _Byte *_First2, _Byte *_Last2, _Byte *& _Mid2) const
+ {
+ ;
+ _Mid2 = _First2;
+ result _Ans = ok;
+ int _Bytes;
+ _Byte _Buf[5];
+ _Statype _Stsave = _State;
+
+ if ((_Bytes = _Wcrtomb(_Buf, L'\0', &_State, &_Cvt)) <= 0)
+ _Ans = error;
+ else if (_Last2 - _Mid2 < --_Bytes)
+ {
+ _State = _Stsave;
+ _Ans = partial;
+ }
+ else if (0 < _Bytes)
+ {
+ ::memcpy_s((_Mid2), (_Last2 - _Mid2), (_Buf), (_Bytes));
+ _Mid2 += _Bytes;
+ }
+ return (_Ans);
+ }
+
+ virtual int do_length(const _Statype& _State, const _Byte *_First1,
+ const _Byte *_Last1, size_t _Count) const
+ {
+ ;
+ int _Wchars;
+ const _Byte *_Mid1;
+ _Statype _Mystate = _State;
+
+ for (_Wchars = 0, _Mid1 = _First1;
+ (size_t)_Wchars < _Count && _Mid1 != _Last1; )
+ {
+ int _Bytes;
+ _Elem _Ch;
+
+ switch (_Bytes = _Mbrtowc((wchar_t *)&_Ch, _Mid1, _Last1 - _Mid1,
+ &_Mystate, &_Cvt))
+ {
+ case -2:
+ return (_Wchars);
+
+ case -1:
+ return (_Wchars);
+
+ case 0:
+ if (_Ch == (_Elem)0)
+ _Bytes = (int)::strlen(_Mid1) + 1;
+
+
+ default:
+ if (_Bytes == -3)
+ _Bytes = 0;
+ _Mid1 += _Bytes;
+ ++_Wchars;
+ }
+ }
+ return (_Wchars);
+ }
+
+ virtual bool do_always_noconv() const throw ()
+ {
+ return (false);
+ }
+
+ virtual int do_max_length() const throw ()
+ {
+ return (5);
+ }
+
+ virtual int do_encoding() const throw ()
+ {
+ return (0);
+ }
+
+private:
+ _Locinfo::_Cvtvec _Cvt;
+ };
+
+
+
+template<class _Elem,
+ class _Byte,
+ class _Statype>
+ class codecvt_byname
+ : public codecvt<_Elem, _Byte, _Statype>
+ {
+public:
+ explicit codecvt_byname(const char *_Locname, size_t _Refs = 0)
+ : codecvt<_Elem, _Byte, _Statype>(_Locname, _Refs)
+ {
+ }
+
+protected:
+ virtual ~codecvt_byname()
+ {
+ }
+ };
+
+
+struct ctype_base
+ : public locale::facet
+ {
+ enum
+ {
+ alnum = 0x4|0x2|0x1|0x100, alpha = 0x2|0x1|0x100,
+ cntrl = 0x20, digit = 0x4, graph = 0x4|0x2|0x10|0x1|0x100,
+ lower = 0x2, print = 0x4|0x2|0x10|0x40|0x1|0x100|0x80,
+ punct = 0x10, space = 0x8|0x40|0x000, upper = 0x1,
+ xdigit = 0x80};
+ typedef short mask;
+
+ ctype_base(size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ }
+
+ ~ctype_base()
+ {
+ }
+
+protected:
+ static void __cdecl _Xran()
+ {
+ throw out_of_range("out_of_range in ctype<T>");
+ }
+ };
+
+
+template<class _Elem>
+ class ctype
+ : public ctype_base
+ {
+public:
+ typedef _Elem char_type;
+
+ bool is(mask _Maskval, _Elem _Ch) const
+ {
+ return (do_is(_Maskval, _Ch));
+ }
+
+ const _Elem * is(const _Elem *_First, const _Elem *_Last,
+ mask *_Dest) const
+ {
+ return (do_is(_First, _Last, _Dest));
+ }
+
+ const _Elem * scan_is(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_is(_Maskval, _First, _Last));
+ }
+
+ const _Elem * scan_not(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_not(_Maskval, _First, _Last));
+ }
+
+ _Elem tolower(_Elem _Ch) const
+ {
+ return (do_tolower(_Ch));
+ }
+
+ const _Elem * tolower(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_tolower(_First, _Last));
+ }
+
+ _Elem toupper(_Elem _Ch) const
+ {
+ return (do_toupper(_Ch));
+ }
+
+ const _Elem * toupper(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_toupper(_First, _Last));
+ }
+
+ _Elem widen(char _Byte) const
+ {
+ return (do_widen(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const char * widen(const char *_First, const char *_Last,
+ _Elem *_Dest) const
+ {
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_widen(_First, _Last, _Dest));
+#pragma warning(pop)
+ }
+
+ const char * _Widen_s(const char *_First, const char *_Last,
+ _Elem *_Dest, size_t _Dest_size) const
+ {
+ return (_Do_widen_s(_First, _Last, _Dest, _Dest_size));
+ }
+
+ char narrow(_Elem _Ch, char _Dflt = '\0') const
+ {
+ return (do_narrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const _Elem * narrow(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_narrow(_First, _Last, _Dflt, _Dest));
+#pragma warning(pop)
+ }
+
+ const _Elem * _Narrow_s(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest, size_t _Dest_size) const
+ {
+ return (_Do_narrow_s(_First, _Last, _Dflt, _Dest, _Dest_size));
+ }
+
+ static locale::id id;
+
+ explicit ctype(size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ ctype(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new ctype<_Elem>;
+ return (2);
+ }
+
+protected:
+ virtual ~ctype()
+ {
+ if (_Ctype._Delfl)
+ free((void *)_Ctype._Table);
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Ctype = _Lobj._Getctype();
+ }
+
+ virtual bool do_is(mask _Maskval, _Elem _Ch) const
+ {
+ return ((_Ctype._Table[(unsigned char)narrow(_Ch)]
+ & _Maskval) != 0);
+ }
+
+ virtual const _Elem * do_is(const _Elem *_First, const _Elem *_Last,
+ mask *_Dest) const
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Ctype._Table[(unsigned char)narrow(*_First)];
+ return (_First);
+ }
+
+ virtual const _Elem * do_scan_is(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && !is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual const _Elem * do_scan_not(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual _Elem do_tolower(_Elem _Ch) const
+ {
+ unsigned char _Byte = (unsigned char)narrow(_Ch, '\0');
+ if (_Byte == '\0')
+ return (_Ch);
+ else
+ return (widen((char)_Tolower(_Byte, &_Ctype)));
+ }
+
+ virtual const _Elem * do_tolower(_Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ {
+ unsigned char _Byte = (unsigned char)narrow(*_First, '\0');
+ if (_Byte != '\0')
+ *_First = (widen((char)_Tolower(_Byte, &_Ctype)));
+ }
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_toupper(_Elem _Ch) const
+ {
+ unsigned char _Byte = (unsigned char)narrow(_Ch, '\0');
+ if (_Byte == '\0')
+ return (_Ch);
+ else
+ return (widen((char)_Toupper(_Byte, &_Ctype)));
+ }
+
+ virtual const _Elem * do_toupper(_Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ {
+ unsigned char _Byte = (unsigned char)narrow(*_First, '\0');
+ if (_Byte != '\0')
+ *_First = (widen((char)_Toupper(_Byte, &_Ctype)));
+ }
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_widen(char _Byte) const
+ {
+ return (_Maklocchr(_Byte, (_Elem *)0, _Cvt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const char * do_widen(const char *_First,
+ const char *_Last, _Elem *_Dest) const
+ {
+
+ return _Do_widen_s(_First, _Last, _Dest, _Last - _First);
+ }
+
+ virtual const char * _Do_widen_s(const char *_First,
+ const char *_Last, _Elem *_Dest, size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Maklocchr(*_First, (_Elem *)0, _Cvt);
+ return (_First);
+ }
+
+ char _Donarrow(_Elem _Ch, char _Dflt) const
+ {
+ char _Byte;
+ if (_Ch == (_Elem)0)
+ return ('\0');
+ else if ((_Byte = _Maklocbyte((_Elem)_Ch, _Cvt)) == '\0')
+ return (_Dflt);
+ else
+ return (_Byte);
+ }
+
+ virtual char do_narrow(_Elem _Ch, char _Dflt) const
+ {
+ return (_Donarrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const _Elem * do_narrow(const _Elem *_First,
+ const _Elem *_Last, char _Dflt, char *_Dest) const
+ {
+
+ return _Do_narrow_s(_First, _Last, _Dflt, _Dest, _Last - _First);
+ }
+
+ virtual const _Elem * _Do_narrow_s(const _Elem *_First,
+ const _Elem *_Last, char _Dflt,
+ char *_Dest,
+ size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Donarrow(*_First, _Dflt);
+ return (_First);
+ }
+
+private:
+ _Locinfo::_Ctypevec _Ctype;
+ _Locinfo::_Cvtvec _Cvt;
+ };
+
+
+template<class _Elem>
+ locale::id ctype<_Elem>::id;
+
+
+template<> class ctype<char>
+ : public ctype_base
+ {
+ typedef ctype<char> _Myt;
+
+public:
+ typedef char _Elem;
+ typedef _Elem char_type;
+
+ bool is(mask _Maskval, _Elem _Ch) const
+ {
+ return ((_Ctype._Table[(unsigned char)_Ch] & _Maskval) != 0);
+ }
+
+ const _Elem * is(const _Elem *_First,
+ const _Elem *_Last, mask *_Dest) const
+ {
+ ;
+ ;
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Ctype._Table[(unsigned char)*_First];
+ return (_First);
+ }
+
+ const _Elem * scan_is(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && !is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ const _Elem * scan_not(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ _Elem tolower(_Elem _Ch) const
+ {
+ return (do_tolower(_Ch));
+ }
+
+ const _Elem * tolower(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_tolower(_First, _Last));
+ }
+
+ _Elem toupper(_Elem _Ch) const
+ {
+ return (do_toupper(_Ch));
+ }
+
+ const _Elem * toupper(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_toupper(_First, _Last));
+ }
+
+ _Elem widen(char _Byte) const
+ {
+ return (do_widen(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const _Elem * widen(const char *_First, const char *_Last,
+ _Elem *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_widen(_First, _Last, _Dest));
+#pragma warning(pop)
+ }
+
+ const _Elem * _Widen_s(const char *_First, const char *_Last,
+ _Elem *_Dest, size_t _Dest_size) const
+ {
+ return (_Do_widen_s(_First, _Last, _Dest, _Dest_size));
+ }
+
+ _Elem narrow(_Elem _Ch, char _Dflt = '\0') const
+ {
+ return (do_narrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const _Elem * narrow(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_narrow(_First, _Last, _Dflt, _Dest));
+#pragma warning(pop)
+ }
+
+ const _Elem * _Narrow_s(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest,
+ size_t _Dest_size) const
+ {
+ return (_Do_narrow_s(_First, _Last, _Dflt, _Dest, _Dest_size));
+ }
+
+ static locale::id& __cdecl _Id_func();
+
+
+
+ static locale::id id;
+
+
+ explicit ctype(const mask *_Table = 0,
+ bool _Deletetable = false,
+ size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ if (_Table != 0)
+ {
+ _Tidy();
+ _Ctype._Table = _Table;
+ _Ctype._Delfl = _Deletetable ? -1 : 0;
+ }
+ }
+
+ ctype(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new ctype<_Elem>;
+ return (2);
+ }
+
+ static const size_t table_size = 1 << 8;
+
+protected:
+ virtual ~ctype()
+ {
+ _Tidy();
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Ctype = _Lobj._Getctype();
+ }
+
+ void _Tidy()
+ {
+ if (0 < _Ctype._Delfl)
+ free((void *)_Ctype._Table);
+ else if (_Ctype._Delfl < 0)
+ delete[] (void *)_Ctype._Table;
+ }
+
+ virtual _Elem do_tolower(_Elem _Ch) const
+ {
+ return ((_Elem)_Tolower((unsigned char)_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_tolower(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = (_Elem)_Tolower((unsigned char)*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_toupper(_Elem _Ch) const
+ {
+ return ((_Elem)_Toupper((unsigned char)_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_toupper(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = (_Elem)_Toupper((unsigned char)*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_widen(char _Byte) const
+ {
+ return (_Byte);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const _Elem * do_widen(const char *_First,
+ const char *_Last, _Elem *_Dest) const
+ {
+
+ return _Do_widen_s(_First, _Last, _Dest, _Last - _First);
+ }
+
+ virtual const _Elem * _Do_widen_s(const char *_First,
+ const char *_Last, _Elem *_Dest, size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ ::memcpy_s((_Dest), (_Dest_size), (_First), (_Last - _First));
+ return (_Last);
+ }
+
+ virtual _Elem do_narrow(_Elem _Ch, char) const
+ {
+ return (_Ch);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const _Elem * do_narrow(const _Elem *_First,
+ const _Elem *_Last, char _Dflt,
+ char *_Dest) const
+ {
+
+ return _Do_narrow_s(_First, _Last, _Dflt, _Dest, _Last - _First);
+ }
+
+ virtual const _Elem * _Do_narrow_s(const _Elem *_First,
+ const _Elem *_Last, char, char *_Dest,
+ size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ ::memcpy_s((_Dest), (_Dest_size), (_First), (_Last - _First));
+ return (_Last);
+ }
+
+ const mask * table() const throw ()
+ {
+ return (_Ctype._Table);
+ }
+
+ static const mask *__cdecl classic_table() throw ()
+ {
+ const _Myt& _Ctype_fac = use_facet<_Myt >(locale::classic());
+ return (_Ctype_fac.table());
+ }
+
+private:
+ _Locinfo::_Ctypevec _Ctype;
+ };
+
+
+template<> class ctype<wchar_t>
+ : public ctype_base
+ {
+ typedef ctype<wchar_t> _Myt;
+
+public:
+ typedef wchar_t _Elem;
+ typedef _Elem char_type;
+
+ bool is(mask _Maskval, _Elem _Ch) const
+ {
+ return (do_is(_Maskval, _Ch));
+ }
+
+ const _Elem * is(const _Elem *_First, const _Elem *_Last,
+ mask *_Dest) const
+ {
+ return (do_is(_First, _Last, _Dest));
+ }
+
+ const _Elem * scan_is(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_is(_Maskval, _First, _Last));
+ }
+
+ const _Elem * scan_not(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_not(_Maskval, _First, _Last));
+ }
+
+ _Elem tolower(_Elem _Ch) const
+ {
+ return (do_tolower(_Ch));
+ }
+
+ const _Elem * tolower(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_tolower(_First, _Last));
+ }
+
+ _Elem toupper(_Elem _Ch) const
+ {
+ return (do_toupper(_Ch));
+ }
+
+ const _Elem * toupper(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_toupper(_First, _Last));
+ }
+
+ _Elem widen(char _Byte) const
+ {
+ return (do_widen(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const char * widen(const char *_First, const char *_Last,
+ _Elem *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_widen(_First, _Last, _Dest));
+#pragma warning(pop)
+ }
+
+ const char * _Widen_s(const char *_First, const char *_Last,
+ _Elem *_Dest, size_t _Dest_size) const
+ {
+ return (_Do_widen_s(_First, _Last, _Dest, _Dest_size));
+ }
+
+ char narrow(_Elem _Ch, char _Dflt = '\0') const
+ {
+ return (do_narrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const _Elem * narrow(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_narrow(_First, _Last, _Dflt, _Dest));
+#pragma warning(pop)
+ }
+
+ const _Elem * _Narrow_s(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest,
+ size_t _Dest_size) const
+ {
+ return (_Do_narrow_s(_First, _Last, _Dflt, _Dest, _Dest_size));
+ }
+
+ static locale::id& __cdecl _Id_func();
+
+
+
+ static locale::id id;
+
+
+ explicit ctype(size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ ctype(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new ctype<_Elem>;
+ return (2);
+ }
+
+protected:
+ virtual ~ctype()
+ {
+ if (_Ctype._Delfl)
+ free((void *)_Ctype._Table);
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Ctype = _Lobj._Getctype();
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ virtual bool do_is(mask _Maskval, _Elem _Ch) const
+ {
+ return ((::_Getwctype(_Ch, &_Ctype) & _Maskval) != 0);
+ }
+
+ virtual const wchar_t * do_is(const _Elem *_First,
+ const _Elem *_Last, mask *_Dest) const
+ {
+ ;
+ ;
+ return (::_Getwctypes(_First, _Last, _Dest, &_Ctype));
+ }
+
+ virtual const _Elem * do_scan_is(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && !is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual const _Elem * do_scan_not(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual _Elem do_tolower(_Elem _Ch) const
+ {
+ return (_Towlower(_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_tolower(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Towlower(*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_toupper(_Elem _Ch) const
+ {
+ return (_Towupper(_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_toupper(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Towupper(*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ _Elem _Dowiden(char _Byte) const
+ {
+ mbstate_t _Mbst = {0};
+ wchar_t _Wc;
+ return (_Mbrtowc(&_Wc, &_Byte, 1, &_Mbst, &_Cvt) < 0
+ ? (wchar_t)(wint_t)(0xFFFF) : _Wc);
+ }
+
+ virtual _Elem do_widen(char _Byte) const
+ {
+ return (_Dowiden(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const char * do_widen(const char *_First,
+ const char *_Last, _Elem *_Dest) const
+ {
+
+ return _Do_widen_s(_First, _Last, _Dest, _Last - _First);
+ }
+
+ virtual const char * _Do_widen_s(const char *_First,
+ const char *_Last, _Elem *_Dest, size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Dowiden(*_First);
+ return (_First);
+ }
+
+ char _Donarrow(_Elem _Ch, char _Dflt) const
+ {
+ char _Buf[5];
+ mbstate_t _Mbst = {0};
+ return (_Wcrtomb(_Buf, _Ch, &_Mbst, &_Cvt) != 1
+ ? _Dflt : _Buf[0]);
+ }
+
+ virtual char do_narrow(_Elem _Ch, char _Dflt) const
+ {
+ return (_Donarrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const _Elem * do_narrow(const _Elem *_First,
+ const _Elem *_Last, char _Dflt,
+ char *_Dest) const
+ {
+
+ return _Do_narrow_s(_First, _Last, _Dflt, _Dest, _Last - _First);
+ }
+
+ virtual const _Elem * _Do_narrow_s(const _Elem *_First,
+ const _Elem *_Last, char _Dflt,
+ char *_Dest,
+ size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Donarrow(*_First, _Dflt);
+ return (_First);
+ }
+
+private:
+ _Locinfo::_Ctypevec _Ctype;
+ _Locinfo::_Cvtvec _Cvt;
+ };
+
+
+
+template<> class ctype<unsigned short>
+ : public ctype_base
+ {
+ typedef ctype<unsigned short> _Myt;
+
+public:
+ typedef unsigned short _Elem;
+ typedef _Elem char_type;
+
+ bool is(mask _Maskval, _Elem _Ch) const
+ {
+ return (do_is(_Maskval, _Ch));
+ }
+
+ const _Elem * is(const _Elem *_First, const _Elem *_Last,
+ mask *_Dest) const
+ {
+ return (do_is(_First, _Last, _Dest));
+ }
+
+ const _Elem * scan_is(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_is(_Maskval, _First, _Last));
+ }
+
+ const _Elem * scan_not(mask _Maskval, const _Elem *_First,
+ const _Elem *_Last) const
+ {
+ return (do_scan_not(_Maskval, _First, _Last));
+ }
+
+ _Elem tolower(_Elem _Ch) const
+ {
+ return (do_tolower(_Ch));
+ }
+
+ const _Elem * tolower(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_tolower(_First, _Last));
+ }
+
+ _Elem toupper(_Elem _Ch) const
+ {
+ return (do_toupper(_Ch));
+ }
+
+ const _Elem * toupper(_Elem *_First, const _Elem *_Last) const
+ {
+ return (do_toupper(_First, _Last));
+ }
+
+ _Elem widen(char _Byte) const
+ {
+ return (do_widen(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const char * widen(const char *_First, const char *_Last,
+ _Elem *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_widen(_First, _Last, _Dest));
+#pragma warning(pop)
+ }
+
+ const char * _Widen_s(const char *_First, const char *_Last,
+ _Elem *_Dest, size_t _Dest_size) const
+ {
+ return (_Do_widen_s(_First, _Last, _Dest, _Dest_size));
+ }
+
+ char narrow(_Elem _Ch, char _Dflt = '\0') const
+ {
+ return (do_narrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ const _Elem * narrow(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest) const
+ {
+
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return (do_narrow(_First, _Last, _Dflt, _Dest));
+#pragma warning(pop)
+ }
+
+ const _Elem * _Narrow_s(const _Elem *_First, const _Elem *_Last,
+ char _Dflt, char *_Dest,
+ size_t _Dest_size) const
+ {
+ return (_Do_narrow_s(_First, _Last, _Dflt, _Dest, _Dest_size));
+ }
+
+ static locale::id& __cdecl _Id_func();
+
+
+
+ static locale::id id;
+
+
+ explicit ctype(size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ ctype(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new ctype<_Elem>;
+ return (2);
+ }
+
+protected:
+ virtual ~ctype()
+ {
+ if (_Ctype._Delfl)
+ free((void *)_Ctype._Table);
+ }
+
+protected:
+ ctype(const char *_Locname, size_t _Refs = 0)
+ : ctype_base(_Refs)
+ {
+ { _Locinfo _Lobj(_Locname);
+ _Init(_Lobj);
+ }
+ }
+
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Ctype = _Lobj._Getctype();
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ virtual bool do_is(mask _Maskval, _Elem _Ch) const
+ {
+ return ((::_Getwctype(_Ch, &_Ctype) & _Maskval) != 0);
+ }
+
+ virtual const _Elem * do_is(const _Elem *_First,
+ const _Elem *_Last, mask *_Dest) const
+ {
+ ;
+ ;
+ return ((const _Elem *)::_Getwctypes((const wchar_t *)_First,
+ (const wchar_t *)_Last, _Dest, &_Ctype));
+ }
+
+ virtual const _Elem * do_scan_is(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && !is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual const _Elem * do_scan_not(mask _Maskval,
+ const _Elem *_First, const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last && is(_Maskval, *_First); ++_First)
+ ;
+ return (_First);
+ }
+
+ virtual _Elem do_tolower(_Elem _Ch) const
+ {
+ return (_Towlower(_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_tolower(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Towlower(*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ virtual _Elem do_toupper(_Elem _Ch) const
+ {
+ return (_Towupper(_Ch, &_Ctype));
+ }
+
+ virtual const _Elem * do_toupper(_Elem *_First,
+ const _Elem *_Last) const
+ {
+ ;
+ for (; _First != _Last; ++_First)
+ *_First = _Towupper(*_First, &_Ctype);
+ return ((const _Elem *)_First);
+ }
+
+ _Elem _Dowiden(char _Byte) const
+ {
+ mbstate_t _Mbst = {0};
+ unsigned short _Wc;
+ return (_Mbrtowc((wchar_t *)&_Wc, &_Byte, 1, &_Mbst, &_Cvt) < 0
+ ? (unsigned short)(wint_t)(0xFFFF) : _Wc);
+ }
+
+ virtual _Elem do_widen(char _Byte) const
+ {
+ return (_Dowiden(_Byte));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const char * do_widen(const char *_First,
+ const char *_Last, _Elem *_Dest) const
+ {
+
+ return _Do_widen_s(_First, _Last, _Dest, _Last - _First);
+ }
+
+ virtual const char * _Do_widen_s(const char *_First,
+ const char *_Last, _Elem *_Dest, size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Dowiden(*_First);
+ return (_First);
+ }
+
+ char _Donarrow(_Elem _Ch, char _Dflt) const
+ {
+ char _Buf[5];
+ mbstate_t _Mbst = {0};
+ return (_Wcrtomb(_Buf, _Ch, &_Mbst, &_Cvt) != 1
+ ? _Dflt : _Buf[0]);
+ }
+
+ virtual char do_narrow(_Elem _Ch, char _Dflt) const
+ {
+ return (_Donarrow(_Ch, _Dflt));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual const _Elem * do_narrow(const _Elem *_First,
+ const _Elem *_Last, char _Dflt, char *_Dest) const
+ {
+
+ return _Do_narrow_s(_First, _Last, _Dflt, _Dest, _Last - _First);
+ }
+
+ virtual const _Elem * _Do_narrow_s(const _Elem *_First,
+ const _Elem *_Last, char _Dflt,
+ char *_Dest,
+ size_t _Dest_size) const
+ {
+ ;
+ ;
+ { if (!(_Dest_size >= (size_t)(_Last - _First))) { ((void)0); ::_invalid_parameter_noinfo(); } ; };
+ for (; _First != _Last; ++_First, ++_Dest)
+ *_Dest = _Donarrow(*_First, _Dflt);
+ return (_First);
+ }
+
+private:
+ _Locinfo::_Ctypevec _Ctype;
+ _Locinfo::_Cvtvec _Cvt;
+ };
+
+
+
+template<class _Elem>
+ class ctype_byname
+ : public ctype<_Elem>
+ {
+public:
+ explicit ctype_byname(const char *_Locname, size_t _Refs = 0)
+ : ctype<_Elem>(_Locname, _Refs)
+ {
+ }
+
+protected:
+ virtual ~ctype_byname()
+ {
+ }
+ };
+
+
+template<> class ctype_byname<char>
+ : public ctype<char>
+ {
+public:
+ explicit ctype_byname(const char *_Locname, size_t _Refs = 0)
+ : ctype<char>(_Locname, _Refs)
+ {
+ }
+
+protected:
+ virtual ~ctype_byname()
+ {
+ }
+ };
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+#pragma warning(disable:4412)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Dummy>
+ class _Iosb
+ {
+public:
+ enum _Dummy_enum {_Dummy_enum_val = 1};
+
+ enum _Fmtflags
+ {
+ _Fmtmask = 0xffff, _Fmtzero = 0};
+
+ static const _Fmtflags skipws = (_Fmtflags)0x0001;
+ static const _Fmtflags unitbuf = (_Fmtflags)0x0002;
+ static const _Fmtflags uppercase = (_Fmtflags)0x0004;
+ static const _Fmtflags showbase = (_Fmtflags)0x0008;
+ static const _Fmtflags showpoint = (_Fmtflags)0x0010;
+ static const _Fmtflags showpos = (_Fmtflags)0x0020;
+ static const _Fmtflags left = (_Fmtflags)0x0040;
+ static const _Fmtflags right = (_Fmtflags)0x0080;
+ static const _Fmtflags internal = (_Fmtflags)0x0100;
+ static const _Fmtflags dec = (_Fmtflags)0x0200;
+ static const _Fmtflags oct = (_Fmtflags)0x0400;
+ static const _Fmtflags hex = (_Fmtflags)0x0800;
+ static const _Fmtflags scientific = (_Fmtflags)0x1000;
+ static const _Fmtflags fixed = (_Fmtflags)0x2000;
+ static const _Fmtflags boolalpha = (_Fmtflags)0x4000;
+ static const _Fmtflags _Stdio = (_Fmtflags)0x8000;
+ static const _Fmtflags adjustfield = (_Fmtflags)(0x0040
+ | 0x0080 | 0x0100);
+ static const _Fmtflags basefield = (_Fmtflags)(0x0200
+ | 0x0400 | 0x0800);
+ static const _Fmtflags floatfield = (_Fmtflags)(0x1000
+ | 0x2000);
+
+ enum _Iostate
+ {
+ _Statmask = 0x17};
+
+ static const _Iostate goodbit = (_Iostate)0x0;
+ static const _Iostate eofbit = (_Iostate)0x1;
+ static const _Iostate failbit = (_Iostate)0x2;
+ static const _Iostate badbit = (_Iostate)0x4;
+ static const _Iostate _Hardfail = (_Iostate)0x10;
+
+ enum _Openmode
+ {
+ _Openmask = 0xff};
+
+ static const _Openmode in = (_Openmode)0x01;
+ static const _Openmode out = (_Openmode)0x02;
+ static const _Openmode ate = (_Openmode)0x04;
+ static const _Openmode app = (_Openmode)0x08;
+ static const _Openmode trunc = (_Openmode)0x10;
+ static const _Openmode _Nocreate = (_Openmode)0x40;
+ static const _Openmode _Noreplace = (_Openmode)0x80;
+ static const _Openmode binary = (_Openmode)0x20;
+
+ enum _Seekdir
+ {
+ _Seekmask = 0x3};
+ static const _Seekdir beg = (_Seekdir)0;
+ static const _Seekdir cur = (_Seekdir)1;
+ static const _Seekdir end = (_Seekdir)2;
+
+ enum
+ {
+ _Openprot = 0x40};
+ };
+
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::skipws;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::unitbuf;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::uppercase;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::showbase;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::showpoint;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::showpos;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::left;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::right;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::internal;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::dec;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::oct;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::hex;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::scientific;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::fixed;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::boolalpha;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::_Stdio;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::adjustfield;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::basefield;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Fmtflags _Iosb<_Dummy>::floatfield;
+
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::goodbit;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::eofbit;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::failbit;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::badbit;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::_Hardfail;
+
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::in;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::out;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::ate;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::app;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::trunc;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::_Nocreate;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::_Noreplace;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Openmode _Iosb<_Dummy>::binary;
+
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Seekdir _Iosb<_Dummy>::beg;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Seekdir _Iosb<_Dummy>::cur;
+template<class _Dummy>
+ const typename _Iosb<_Dummy>::_Seekdir _Iosb<_Dummy>::end;
+
+
+class ios_base
+ : public _Iosb<int>
+ {
+public:
+ typedef int fmtflags;
+ typedef int iostate;
+ typedef int openmode;
+ typedef int seekdir;
+
+ typedef std::streamoff streamoff;
+ typedef std::streampos streampos;
+
+ enum event
+ {
+ erase_event, imbue_event, copyfmt_event};
+
+ typedef void (__cdecl *event_callback)(event, ios_base&, int);
+ typedef unsigned int io_state, open_mode, seek_dir;
+
+
+ class failure
+ : public runtime_error
+ {
+ public:
+ explicit failure(const string &_Message)
+ : runtime_error(_Message)
+ {
+ }
+
+ virtual ~failure() throw ()
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+ };
+
+
+ class Init
+ {
+ public:
+ Init()
+ {
+ _Init_ctor(this);
+ }
+
+ ~Init()
+ {
+ _Init_dtor(this);
+ }
+
+ private:
+ static void __cdecl _Init_ctor(Init *);
+ static void __cdecl _Init_dtor(Init *);
+
+ static int& __cdecl _Init_cnt_func();
+
+
+
+ static int _Init_cnt;
+
+ };
+
+ ios_base& operator=(const ios_base& _Right)
+ {
+ if (this != &_Right)
+ {
+ _Mystate = _Right._Mystate;
+ copyfmt(_Right);
+ }
+ return (*this);
+ }
+
+ operator void *() const
+ {
+ return (fail() ? 0 : (void *)this);
+ }
+
+ bool operator!() const
+ {
+ return (fail());
+ }
+
+ void clear(iostate _State, bool _Reraise)
+ {
+ _Mystate = (iostate)(_State & _Statmask);
+ if ((_Mystate & _Except) == 0)
+ ;
+ else if (_Reraise)
+ throw;
+ else if (_Mystate & _Except & badbit)
+ throw failure("ios_base::badbit set");
+ else if (_Mystate & _Except & failbit)
+ throw failure("ios_base::failbit set");
+ else
+ throw failure("ios_base::eofbit set");
+ }
+
+ void clear(iostate _State = goodbit)
+ {
+ clear(_State, false);
+ }
+
+ void clear(io_state _State)
+ {
+ clear((iostate)_State);
+ }
+
+ iostate rdstate() const
+ {
+ return (_Mystate);
+ }
+
+
+ void setstate(iostate _State, bool _Exreraise)
+ {
+ if (_State != goodbit)
+ clear((iostate)((int)rdstate() | (int)_State), _Exreraise);
+ }
+
+ void setstate(iostate _State)
+ {
+ if (_State != goodbit)
+ clear((iostate)((int)rdstate() | (int)_State), false);
+ }
+
+ void setstate(io_state _State)
+ {
+ setstate((iostate)_State);
+ }
+
+ bool good() const
+ {
+ return (rdstate() == goodbit);
+ }
+
+ bool eof() const
+ {
+ return ((int)rdstate() & (int)eofbit);
+ }
+
+ bool fail() const
+ {
+ return (((int)rdstate()
+ & ((int)badbit | (int)failbit)) != 0);
+ }
+
+ bool bad() const
+ {
+ return (((int)rdstate() & (int)badbit) != 0);
+ }
+
+
+
+
+ iostate exceptions() const
+ {
+ return (_Except);
+ }
+
+ void exceptions(iostate _Newexcept)
+ {
+ _Except = (iostate)((int)_Newexcept & (int)_Statmask);
+ clear(_Mystate);
+ }
+
+ void exceptions(io_state _State)
+ {
+ exceptions((iostate)_State);
+ }
+
+ fmtflags flags() const
+ {
+ return (_Fmtfl);
+ }
+
+ fmtflags flags(fmtflags _Newfmtflags)
+ {
+ fmtflags _Oldfmtflags = _Fmtfl;
+ _Fmtfl = (fmtflags)((int)_Newfmtflags & (int)_Fmtmask);
+ return (_Oldfmtflags);
+ }
+
+ fmtflags setf(fmtflags _Newfmtflags)
+ {
+ ios_base::fmtflags _Oldfmtflags = _Fmtfl;
+ _Fmtfl = (fmtflags)((int)_Fmtfl
+ | (int)_Newfmtflags & (int)_Fmtmask);
+ return (_Oldfmtflags);
+ }
+
+ fmtflags setf(fmtflags _Newfmtflags, fmtflags _Mask)
+ {
+ ios_base::fmtflags _Oldfmtflags = _Fmtfl;
+ _Fmtfl = (fmtflags)(((int)_Fmtfl & (int)~_Mask)
+ | ((int)_Newfmtflags & (int)_Mask & (int)_Fmtmask));
+ return (_Oldfmtflags);
+ }
+
+ void unsetf(fmtflags _Mask)
+ {
+ _Fmtfl = (fmtflags)((int)_Fmtfl & (int)~_Mask);
+ }
+
+ streamsize precision() const
+ {
+ return (_Prec);
+ }
+
+ streamsize precision(streamsize _Newprecision)
+ {
+ streamsize _Oldprecision = _Prec;
+ _Prec = _Newprecision;
+ return (_Oldprecision);
+ }
+
+ streamsize width() const
+ {
+ return (_Wide);
+ }
+
+ streamsize width(streamsize _Newwidth)
+ {
+ streamsize _Oldwidth = _Wide;
+ _Wide = _Newwidth;
+ return (_Oldwidth);
+ }
+
+ locale getloc() const
+ {
+ return (*_Ploc);
+ }
+
+ locale imbue(const locale& _Loc)
+ {
+ locale _Oldlocale = *_Ploc;
+ *_Ploc = _Loc;
+ _Callfns(imbue_event);
+ return (_Oldlocale);
+ }
+
+ static int __cdecl xalloc()
+ {
+ { ::std:: _Lockit _Lock(2);
+ return (_Index++);
+ }
+ }
+
+ long& iword(int _Idx)
+ {
+ return (_Findarr(_Idx)._Lo);
+ }
+
+ void *& pword(int _Idx)
+ {
+ return (_Findarr(_Idx)._Vp);
+ }
+
+ void register_callback(event_callback _Pfn, int _Idx)
+ {
+ _Calls = new _Fnarray(_Idx, _Pfn, _Calls);
+ }
+
+ ios_base& copyfmt(const ios_base& _Other)
+ {
+ if (this != &_Other)
+ {
+ _Tidy();
+ *_Ploc = *_Other._Ploc;
+ _Fmtfl = _Other._Fmtfl;
+ _Prec = _Other._Prec;
+ _Wide = _Other._Wide;
+ _Iosarray *_Ptr = _Other._Arr;
+
+ for (_Arr = 0; _Ptr != 0; _Ptr = _Ptr->_Next)
+ if (_Ptr->_Lo != 0 || _Ptr->_Vp != 0)
+ {
+ iword(_Ptr->_Index) = _Ptr->_Lo;
+ pword(_Ptr->_Index) = _Ptr->_Vp;
+ }
+
+ for (_Fnarray *_Q = _Other._Calls; _Q != 0; _Q = _Q->_Next)
+ register_callback(_Q->_Pfn, _Q->_Index);
+
+ _Callfns(copyfmt_event);
+ exceptions(_Other._Except);
+ }
+ return (*this);
+ }
+
+
+ virtual ~ios_base()
+ {
+ _Ios_base_dtor(this);
+ }
+
+ static bool __cdecl sync_with_stdio(bool _Newsync = true)
+ {
+ { ::std:: _Lockit _Lock(2);
+ const bool _Oldsync = _Sync;
+ _Sync = _Newsync;
+ return (_Oldsync);
+ }
+ }
+
+ static void __cdecl _Addstd(ios_base *);
+ size_t _Stdstr;
+
+protected:
+ ios_base()
+ {
+ }
+
+ void _Init()
+ {
+ _Ploc = 0;
+ _Except = goodbit;
+ _Fmtfl = skipws | dec;
+ _Prec = 6;
+ _Wide = 0;
+ _Arr = 0;
+ _Calls = 0;
+ clear(goodbit);
+ _Ploc = new locale;
+ }
+
+private:
+
+ struct _Iosarray
+ {
+ public:
+ _Iosarray(int _Idx, _Iosarray *_Link)
+ : _Next(_Link), _Index(_Idx), _Lo(0), _Vp(0)
+ {
+ }
+
+ _Iosarray *_Next;
+ int _Index;
+ long _Lo;
+ void *_Vp;
+ };
+
+
+ struct _Fnarray
+ {
+ _Fnarray(int _Idx, event_callback _Pnew, _Fnarray *_Link)
+ : _Next(_Link), _Index(_Idx), _Pfn(_Pnew)
+ {
+ }
+
+ _Fnarray *_Next;
+ int _Index;
+ event_callback _Pfn;
+ };
+
+ void _Callfns(event _Ev)
+ {
+ for (_Fnarray *_Ptr = _Calls; _Ptr != 0; _Ptr = _Ptr->_Next)
+ (*_Ptr->_Pfn)(_Ev, *this, _Ptr->_Index);
+ }
+
+ _Iosarray& _Findarr(int _Idx)
+ {
+ _Iosarray *_Ptr, *_Q;
+
+ for (_Ptr = _Arr, _Q = 0; _Ptr != 0; _Ptr = _Ptr->_Next)
+ if (_Ptr->_Index == _Idx)
+ return (*_Ptr);
+ else if (_Q == 0 && _Ptr->_Lo == 0 && _Ptr->_Vp == 0)
+ _Q = _Ptr;
+
+ if (_Q != 0)
+ {
+ _Q->_Index = _Idx;
+ return (*_Q);
+ }
+
+ _Arr = new _Iosarray(_Idx, _Arr);
+ return (*_Arr);
+ }
+
+ void __cdecl _Tidy()
+ {
+ _Callfns(erase_event);
+ _Iosarray *_Q1, *_Q2;
+
+ for (_Q1 = _Arr; _Q1 != 0; _Q1 = _Q2)
+ _Q2 = _Q1->_Next, delete (_Q1);
+ _Arr = 0;
+
+ _Fnarray *_Q3, *_Q4;
+ for (_Q3 = _Calls; _Q3 != 0; _Q3 = _Q4)
+ _Q4 = _Q3->_Next, delete (_Q3);
+ _Calls = 0;
+ }
+
+ static void __cdecl _Ios_base_dtor(ios_base *);
+
+ iostate _Mystate;
+ iostate _Except;
+ fmtflags _Fmtfl;
+ streamsize _Prec;
+ streamsize _Wide;
+ _Iosarray *_Arr;
+ _Fnarray *_Calls;
+ locale *_Ploc;
+
+
+
+
+
+ static int _Index;
+ static bool _Sync;
+
+ static int& __cdecl _Index_func();
+ static bool& __cdecl _Sync_func();
+ };
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+template<class _Elem,
+ class _Traits>
+ class basic_streambuf
+ {
+
+ basic_streambuf(const basic_streambuf<_Elem, _Traits>&);
+ basic_streambuf<_Elem, _Traits>&
+ operator=(const basic_streambuf<_Elem, _Traits>&);
+
+
+protected:
+ basic_streambuf()
+ : _Plocale(new(locale))
+ {
+ _Init();
+ }
+
+ basic_streambuf(_Uninitialized)
+ {
+ }
+
+public:
+ typedef basic_streambuf<_Elem, _Traits> _Myt;
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+
+ virtual ~basic_streambuf()
+ {
+ delete (_Plocale);
+ }
+
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+
+ pos_type pubseekoff(off_type _Off, ios_base::seekdir _Way,
+ ios_base::openmode _Mode = ios_base::in | ios_base::out)
+ {
+ return (seekoff(_Off, _Way, _Mode));
+ }
+
+ pos_type pubseekoff(off_type _Off, ios_base::seek_dir _Way,
+ ios_base::open_mode _Mode)
+ {
+ return (pubseekoff(_Off, (ios_base::seekdir)_Way,
+ (ios_base::openmode)_Mode));
+ }
+
+ pos_type pubseekpos(pos_type _Pos,
+ ios_base::openmode _Mode = ios_base::in | ios_base::out)
+ {
+ return (seekpos(_Pos, _Mode));
+ }
+
+ pos_type pubseekpos(pos_type _Pos, ios_base::open_mode _Mode)
+ {
+ return (seekpos(_Pos, (ios_base::openmode)_Mode));
+ }
+
+ _Myt *pubsetbuf(_Elem *_Buffer, streamsize _Count)
+ {
+ return (setbuf(_Buffer, _Count));
+ }
+
+ locale pubimbue(const locale &_Newlocale)
+ {
+ locale _Oldlocale = *_Plocale;
+ imbue(_Newlocale);
+ *_Plocale = _Newlocale;
+ return (_Oldlocale);
+ }
+
+ locale getloc() const
+ {
+ return (*_Plocale);
+ }
+
+ streamsize in_avail()
+ {
+ streamsize _Res = _Gnavail();
+ return (0 < _Res ? _Res : showmanyc());
+ }
+
+ int pubsync()
+ {
+ return (sync());
+ }
+
+ int_type sbumpc()
+ {
+ return (0 < _Gnavail()
+ ? _Traits::to_int_type(*_Gninc()) : uflow());
+ }
+
+ int_type sgetc()
+ {
+ return (0 < _Gnavail()
+ ? _Traits::to_int_type(*gptr()) : underflow());
+ }
+
+ streamsize _Sgetn_s(_Elem *_Ptr, size_t _Ptr_size, streamsize _Count)
+ {
+ return _Xsgetn_s(_Ptr, _Ptr_size, _Count);
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ streamsize sgetn(_Elem *_Ptr, streamsize _Count)
+ {
+#pragma warning(push)
+#pragma warning(disable:4996)
+ return xsgetn(_Ptr, _Count);
+#pragma warning(pop)
+ }
+
+ int_type snextc()
+ {
+ return (1 < _Gnavail()
+ ? _Traits::to_int_type(*_Gnpreinc())
+ : _Traits::eq_int_type(_Traits::eof(), sbumpc())
+ ? _Traits::eof() : sgetc());
+ }
+
+ int_type sputbackc(_Elem _Ch)
+ {
+ return (gptr() != 0 && eback() < gptr()
+ && _Traits::eq(_Ch, gptr()[-1])
+ ? _Traits::to_int_type(*_Gndec())
+ : pbackfail(_Traits::to_int_type(_Ch)));
+ }
+
+ void stossc()
+ {
+ if (0 < _Gnavail())
+ _Gninc();
+ else
+ uflow();
+ }
+
+ int_type sungetc()
+ {
+ return (gptr() != 0 && eback() < gptr()
+ ? _Traits::to_int_type(*_Gndec()) : pbackfail());
+ }
+
+ int_type sputc(_Elem _Ch)
+ {
+ return (0 < _Pnavail()
+ ? _Traits::to_int_type(*_Pninc() = _Ch)
+ : overflow(_Traits::to_int_type(_Ch)));
+ }
+
+ streamsize sputn(const _Elem *_Ptr, streamsize _Count)
+ {
+ return (xsputn(_Ptr, _Count));
+ }
+
+ void _Lock()
+ {
+ _Mylock._Lock();
+ }
+
+ void _Unlock()
+ {
+ _Mylock._Unlock();
+ }
+
+
+protected:
+ _Elem *eback() const
+ {
+ return (*_IGfirst);
+ }
+
+ _Elem *gptr() const
+ {
+ return (*_IGnext);
+ }
+
+ _Elem *pbase() const
+ {
+ return (*_IPfirst);
+ }
+
+ _Elem *pptr() const
+ {
+ return (*_IPnext);
+ }
+
+ _Elem *egptr() const
+ {
+ return (*_IGnext + *_IGcount);
+ }
+
+ void gbump(int _Off)
+ {
+ *_IGcount -= _Off;
+ *_IGnext += _Off;
+ }
+
+ void setg(_Elem *_First, _Elem *_Next, _Elem *_Last)
+ {
+ *_IGfirst = _First;
+ *_IGnext = _Next;
+ *_IGcount = (int)(_Last - _Next);
+ }
+
+ _Elem *epptr() const
+ {
+ return (*_IPnext + *_IPcount);
+ }
+
+ _Elem *_Gndec()
+ {
+ ++*_IGcount;
+ return (--*_IGnext);
+ }
+
+ _Elem *_Gninc()
+ {
+ --*_IGcount;
+ return ((*_IGnext)++);
+ }
+
+ _Elem *_Gnpreinc()
+ {
+ --*_IGcount;
+ return (++(*_IGnext));
+ }
+
+ streamsize _Gnavail() const
+ {
+ return (*_IGnext != 0 ? *_IGcount : 0);
+ }
+
+ void pbump(int _Off)
+ {
+ *_IPcount -= _Off;
+ *_IPnext += _Off;
+ }
+
+ void setp(_Elem *_First, _Elem *_Last)
+ {
+ *_IPfirst = _First;
+ *_IPnext = _First;
+ *_IPcount = (int)(_Last - _First);
+ }
+
+ void setp(_Elem *_First, _Elem *_Next, _Elem *_Last)
+ {
+ *_IPfirst = _First;
+ *_IPnext = _Next;
+ *_IPcount = (int)(_Last - _Next);
+ }
+
+ _Elem *_Pninc()
+ {
+ --*_IPcount;
+ return ((*_IPnext)++);
+ }
+
+ streamsize _Pnavail() const
+ {
+ return (*_IPnext != 0 ? *_IPcount : 0);
+ }
+
+ void _Init()
+ {
+ _IGfirst = &_Gfirst, _IPfirst = &_Pfirst;
+ _IGnext = &_Gnext, _IPnext = &_Pnext;
+ _IGcount = &_Gcount, _IPcount = &_Pcount;
+ setp(0, 0), setg(0, 0, 0);
+ }
+
+ void _Init(_Elem **_Gf, _Elem **_Gn, int *_Gc,
+ _Elem **_Pf, _Elem **_Pn, int *_Pc)
+ {
+ _IGfirst = _Gf, _IPfirst = _Pf;
+ _IGnext = _Gn, _IPnext = _Pn;
+ _IGcount = _Gc, _IPcount = _Pc;
+ }
+
+ virtual int_type overflow(int_type = _Traits::eof())
+ {
+ return (_Traits::eof());
+ }
+
+ virtual int_type pbackfail(int_type = _Traits::eof())
+ {
+ return (_Traits::eof());
+ }
+
+ virtual streamsize showmanyc()
+ {
+ return (0);
+ }
+
+ virtual int_type underflow()
+ {
+ return (_Traits::eof());
+ }
+
+ virtual int_type uflow()
+ {
+ return (_Traits::eq_int_type(_Traits::eof(), underflow())
+ ? _Traits::eof() : _Traits::to_int_type(*_Gninc()));
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ virtual streamsize xsgetn(_Elem * _Ptr,
+ streamsize _Count)
+ {
+
+ return _Xsgetn_s(_Ptr, (size_t)-1, _Count);
+ }
+
+ virtual streamsize _Xsgetn_s(_Elem * _Ptr,
+ size_t _Ptr_size, streamsize _Count)
+ {
+ int_type _Meta;
+ streamsize _Stream_size, _Size, _Copied;
+
+ for (_Copied = 0; 0 < _Count; )
+ if (0 < (_Stream_size = _Gnavail()))
+ {
+ _Size = _Stream_size;
+ if (_Count < _Size)
+ _Size = _Count;
+ _Traits_helper::copy_s<_Traits>(_Ptr, _Ptr_size, gptr(), _Size);
+ _Ptr += _Size;
+ _Copied += _Size;
+ _Count -= _Size;
+ gbump((int)_Size);
+ }
+ else if (_Traits::eq_int_type(_Traits::eof(), _Meta = uflow()))
+ break;
+ else
+ {
+ *_Ptr++ = _Traits::to_char_type(_Meta);
+ ++_Copied;
+ --_Count;
+ }
+
+ return (_Copied);
+ }
+
+ virtual streamsize xsputn(const _Elem *_Ptr,
+ streamsize _Count)
+ {
+ streamsize _Stream_size, _Size, _Copied;
+
+ for (_Copied = 0; 0 < _Count; )
+ if (0 < (_Stream_size = _Pnavail()))
+ {
+ _Size = _Stream_size;
+ if (_Count < _Size)
+ _Size = _Count;
+ _Traits_helper::copy_s<_Traits>(pptr(), _Stream_size, _Ptr, _Size);
+ _Ptr += _Size;
+ _Copied += _Size;
+ _Count -= _Size;
+ pbump((int)_Size);
+ }
+ else if (_Traits::eq_int_type(_Traits::eof(),
+ overflow(_Traits::to_int_type(*_Ptr))))
+ break;
+ else
+ {
+ ++_Ptr;
+ ++_Copied;
+ --_Count;
+ }
+
+ return (_Copied);
+ }
+
+ virtual pos_type seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ {
+ return (streampos(_BADOFF));
+ }
+
+ virtual pos_type seekpos(pos_type,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ {
+ return (streampos(_BADOFF));
+ }
+
+ virtual _Myt * setbuf(_Elem *, streamsize)
+ {
+ return (this);
+ }
+
+ virtual int sync()
+ {
+ return (0);
+ }
+
+ virtual void imbue(const locale&)
+ {
+ }
+
+private:
+ _Mutex _Mylock;
+ _Elem *_Gfirst;
+ _Elem *_Pfirst;
+ _Elem **_IGfirst;
+ _Elem **_IPfirst;
+ _Elem *_Gnext;
+ _Elem *_Pnext;
+ _Elem **_IGnext;
+ _Elem **_IPnext;
+ int _Gcount;
+ int _Pcount;
+ int *_IGcount;
+ int *_IPcount;
+ locale *_Plocale;
+ };
+
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+
+
+
+extern "C" {
+
+extern long __cdecl _Stolx(const char *, char **,
+ int, int *);
+extern unsigned long __cdecl _Stoulx(const char *,
+ char **, int, int *);
+extern float __cdecl _Stofx(const char *, char **,
+ long, int *);
+extern double __cdecl _Stodx(const char *, char **,
+ long, int *);
+extern long double __cdecl _Stoldx(const char *,
+ char **, long, int *);
+
+}
+
+
+
+
+
+
+
+
+
+namespace std {
+
+
+
+
+template<class _Elem>
+ class numpunct
+ : public locale::facet
+ {
+public:
+ typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
+ string_type;
+ typedef _Elem char_type;
+
+ static locale::id id;
+
+ _Elem decimal_point() const
+ {
+ return (do_decimal_point());
+ }
+
+ _Elem thousands_sep() const
+ {
+ return (do_thousands_sep());
+ }
+
+ string grouping() const
+ {
+ return (do_grouping());
+ }
+
+ string_type falsename() const
+ {
+ return (do_falsename());
+ }
+
+ string_type truename() const
+ {
+ return (do_truename());
+ }
+
+ explicit numpunct(size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ if (_Kseparator == 0)
+ _Kseparator =
+ _Maklocchr(',', (_Elem *)0, _Lobj._Getcvt());
+ }
+ }
+
+ numpunct(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new numpunct<_Elem>;
+ return (4);
+ }
+
+protected:
+ virtual ~numpunct()
+ {
+ _Tidy();
+ }
+
+protected:
+ numpunct(const char *_Locname, size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ { _Locinfo _Lobj(_Locname);
+ _Init(_Lobj);
+ }
+ }
+
+ void _Init(const _Locinfo& _Lobj)
+ {
+ const lconv *_Ptr = _Lobj._Getlconv();
+
+ _Grouping = 0;
+ _Falsename = 0;
+ _Truename = 0;
+
+ try {
+ _Grouping = _Maklocstr(_Ptr->grouping, (char *)0, _Lobj._Getcvt());
+ _Falsename = _Maklocstr(_Lobj._Getfalse(), (_Elem *)0, _Lobj._Getcvt());
+ _Truename = _Maklocstr(_Lobj._Gettrue(), (_Elem *)0, _Lobj._Getcvt());
+ } catch (...) {
+ _Tidy();
+ throw;
+ }
+
+ _Dp = _Maklocchr(_Ptr->decimal_point[0], (_Elem *)0, _Lobj._Getcvt());
+ _Kseparator =
+ _Maklocchr(_Ptr->thousands_sep[0], (_Elem *)0, _Lobj._Getcvt());
+ }
+
+ virtual _Elem do_decimal_point() const
+ {
+ return (_Dp);
+ }
+
+ virtual _Elem do_thousands_sep() const
+ {
+ return (_Kseparator);
+ }
+
+ virtual string do_grouping() const
+ {
+ return (string(_Grouping));
+ }
+
+ virtual string_type do_falsename() const
+ {
+ return (string_type(_Falsename));
+ }
+
+ virtual string_type do_truename() const
+ {
+ return (string_type(_Truename));
+ }
+
+private:
+ void _Tidy()
+ {
+ delete[] ((void *)_Grouping);
+ delete[] ((void *)_Falsename);
+ delete[] ((void *)_Truename);
+ }
+
+ const char *_Grouping;
+ _Elem _Dp;
+ _Elem _Kseparator;
+ const _Elem *_Falsename;
+ const _Elem *_Truename;
+ };
+
+typedef numpunct<char> _Npc;
+typedef numpunct<wchar_t> _Npwc;
+
+
+template<class _Elem>
+ class numpunct_byname
+ : public numpunct<_Elem>
+ {
+public:
+ explicit numpunct_byname(const char *_Locname, size_t _Refs = 0)
+ : numpunct<_Elem>(_Locname, _Refs)
+ {
+ }
+
+protected:
+ virtual ~numpunct_byname()
+ {
+ }
+ };
+
+
+template<class _Elem>
+ locale::id numpunct<_Elem>::id;
+
+
+template<class _Elem,
+ class _InIt = istreambuf_iterator<_Elem, char_traits<_Elem> > >
+ class num_get
+ : public locale::facet
+ {
+public:
+ typedef numpunct<_Elem> _Mypunct;
+ typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
+ _Mystr;
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new num_get<_Elem, _InIt>;
+ return (4);
+ }
+
+ static locale::id id;
+
+protected:
+ virtual ~num_get()
+ {
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ _Locinfo::_Cvtvec _Cvt;
+
+public:
+ explicit num_get(size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ num_get(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ typedef _Elem char_type;
+ typedef _InIt iter_type;
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ _Bool& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned short& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned int& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ long& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned long& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ __int64& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned __int64& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ float& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ double& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ long double& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+ _InIt get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ void *& _Val) const
+ {
+ return (do_get(_First, _Last, _Iosbase, _State, _Val));
+ }
+
+protected:
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ _Bool& _Val) const
+ {
+ ;
+ int _Ans = -1;
+
+ if (_Iosbase.flags() & ios_base::boolalpha)
+ {
+ typedef typename _Mystr::size_type _Mystrsize;
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Iosbase.getloc());
+ _Mystr _Str((_Mystrsize)1, (char_type)0);
+ _Str += _Punct_fac.falsename();
+ _Str += (char_type)0;
+ _Str += _Punct_fac.truename();
+ _Ans = _Getloctxt(_First, _Last, (size_t)2, _Str.c_str());
+ }
+ else
+ {
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ const unsigned long _Ulo = ::_Stoulx(_Ac, &_Ep,
+ _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
+ _Iosbase.getloc()), &_Errno);
+ if (_Ep != _Ac && _Errno == 0 && _Ulo <= 1)
+ _Ans = _Ulo;
+ }
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ans < 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans != 0;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned short& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
+ _Iosbase.getloc());
+ char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac;
+ const unsigned long _Ans =
+ ::_Stoulx(_Ptr, &_Ep, _Base, &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ptr || _Errno != 0 || 0xffff < _Ans)
+ _State |= ios_base::failbit;
+ else
+ _Val = (unsigned short)(_Ac[0] == '-'
+ ? 0 -_Ans : _Ans);
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned int& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
+ _Iosbase.getloc());
+ char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac;
+ const unsigned long _Ans =
+ ::_Stoulx(_Ptr, &_Ep, _Base, &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ptr || _Errno != 0 || 0xffffffff < _Ans)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ac[0] == '-' ? 0 -_Ans : _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ long& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ const long _Ans = ::_Stolx(_Ac, &_Ep,
+ _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
+ _Iosbase.getloc()), &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned long& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ const unsigned long _Ans = ::_Stoulx(_Ac, &_Ep,
+ _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
+ _Iosbase.getloc()), &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ __int64& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ const __int64 _Ans = ::_strtoi64(_Ac, &_Ep, _Getifld(_Ac, _First, _Last, _Iosbase.flags(), _Iosbase.getloc()));
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ unsigned __int64& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+ const unsigned __int64 _Ans = ::_strtoui64(_Ac, &_Ep, _Getifld(_Ac, _First, _Last, _Iosbase.flags(), _Iosbase.getloc()));
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ float& _Val) const
+ {
+ ;
+ char _Ac[8 + 36 + 16], *_Ep;
+ int _Errno = 0;
+ const float _Ans = ::_Stofx(_Ac, &_Ep,
+ _Getffld(_Ac, _First, _Last,
+ _Iosbase.getloc()), &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ double& _Val) const
+ {
+ ;
+ char _Ac[8 + 36 + 16], *_Ep;
+ int _Errno = 0;
+ const double _Ans = ::_Stodx(_Ac, &_Ep,
+ _Getffld(_Ac, _First, _Last,
+ _Iosbase.getloc()), &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ long double& _Val) const
+ {
+ ;
+ char _Ac[8 + 36 + 16], *_Ep;
+ int _Errno = 0;
+ const long double _Ans = ::_Stoldx(_Ac, &_Ep,
+ _Getffld(_Ac, _First, _Last,
+ _Iosbase.getloc()), &_Errno);
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Ans;
+ return (_First);
+ }
+
+ virtual _InIt do_get(_InIt _First, _InIt _Last,
+ ios_base& _Iosbase, ios_base::iostate& _State,
+ void *& _Val) const
+ {
+ ;
+ char _Ac[32], *_Ep;
+ int _Errno = 0;
+
+
+ int _Base = _Getifld(_Ac, _First, _Last, ios_base::hex,
+ _Iosbase.getloc());
+ const unsigned __int64 _Ans =
+ (sizeof (void *) == sizeof (unsigned long))
+ ? (unsigned __int64)::_Stoulx(_Ac, &_Ep, _Base, &_Errno)
+ : ::_strtoui64(_Ac, &_Ep, _Base);
+
+
+
+
+
+
+
+ if (_First == _Last)
+ _State |= ios_base::eofbit;
+ if (_Ep == _Ac || _Errno != 0)
+ _State |= ios_base::failbit;
+ else
+ _Val = (void *)(uintptr_t)_Ans;
+ return (_First);
+ }
+
+private:
+ int __cdecl _Getifld( char *_Ac,
+ _InIt& _First, _InIt& _Last, ios_base::fmtflags _Basefield,
+ const locale& _Loc) const
+ {
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Loc);
+ const string _Grouping = _Punct_fac.grouping();
+ const _Elem _Kseparator = _Grouping.size() == 0
+ ? (_Elem)0 : _Punct_fac.thousands_sep();
+ const _Elem _E0 = _Maklocchr('0', (_Elem *)0, _Cvt);
+ char *_Ptr = _Ac;
+
+ if (_First == _Last)
+ ;
+ else if (*_First == _Maklocchr('+', (_Elem *)0, _Cvt))
+ *_Ptr++ = '+', ++_First;
+ else if (*_First == _Maklocchr('-', (_Elem *)0, _Cvt))
+ *_Ptr++ = '-', ++_First;
+
+ _Basefield &= ios_base::basefield;
+ int _Base = _Basefield == ios_base::oct ? 8
+ : _Basefield == ios_base::hex ? 16
+ : _Basefield == ios_base::_Fmtzero ? 0 : 10;
+
+ bool _Seendigit = false;
+ bool _Nonzero = false;
+
+ if (_First != _Last && *_First == _E0)
+ {
+ _Seendigit = true, ++_First;
+ if (_First != _Last && (*_First == _Maklocchr('x', (_Elem *)0, _Cvt)
+ || *_First == _Maklocchr('X', (_Elem *)0, _Cvt))
+ && (_Base == 0 || _Base == 16))
+ _Base = 16, _Seendigit = false, ++_First;
+ else if (_Base == 0)
+ _Base = 8;
+ }
+
+ int _Dlen = _Base == 0 || _Base == 10 ? 10
+ : _Base == 8 ? 8 : 16 + 6;
+ string _Groups((size_t)1, (char)_Seendigit);
+ size_t _Group = 0;
+
+ for (char *const _Pe = &_Ac[32 - 1];
+ _First != _Last; ++_First)
+ if (::memchr("0123456789abcdefABCDEF",
+ *_Ptr = _Maklocbyte((_Elem)*_First, _Cvt), _Dlen) != 0)
+ {
+ if ((_Nonzero || *_Ptr != '0') && _Ptr < _Pe)
+ ++_Ptr, _Nonzero = true;
+ _Seendigit = true;
+ if (_Groups[_Group] != 127)
+ ++_Groups[_Group];
+ }
+ else if (_Groups[_Group] == '\0'
+ || _Kseparator == (_Elem)0
+ || *_First != _Kseparator)
+ break;
+ else
+ {
+ _Groups.append((string::size_type)1, '\0');
+ ++_Group;
+ }
+
+ if (_Group == 0)
+ ;
+ else if ('\0' < _Groups[_Group])
+ ++_Group;
+ else
+ _Seendigit = false;
+
+ for (const char *_Pg = _Grouping.c_str(); _Seendigit && 0 < _Group; )
+ if (*_Pg == 127)
+ break;
+ else if (0 < --_Group && *_Pg != _Groups[_Group]
+ || 0 == _Group && *_Pg < _Groups[_Group])
+ _Seendigit = false;
+ else if ('\0' < _Pg[1])
+ ++_Pg;
+
+ if (_Seendigit && !_Nonzero)
+ *_Ptr++ = '0';
+ else if (!_Seendigit)
+ _Ptr = _Ac;
+ *_Ptr = '\0';
+ return (_Base);
+ }
+
+ int __cdecl _Getffld( char *_Ac,
+ _InIt& _First, _InIt &_Last, const locale& _Loc) const
+ {
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Loc);
+ const string _Grouping = _Punct_fac.grouping();
+ const _Elem _E0 = _Maklocchr('0', (_Elem *)0, _Cvt);
+ char *_Ptr = _Ac;
+ bool _Bad = false;
+
+ if (_First == _Last)
+ ;
+ else if (*_First == _Maklocchr('+', (_Elem *)0, _Cvt))
+ *_Ptr++ = '+', ++_First;
+ else if (*_First == _Maklocchr('-', (_Elem *)0, _Cvt))
+ *_Ptr++ = '-', ++_First;
+
+ bool _Seendigit = false;
+ int _Significant = 0;
+ int _Pten = 0;
+
+ if (*_Grouping.c_str() == 127 || *_Grouping.c_str() <= '\0')
+ for (; _First != _Last
+ && _E0 <= *_First && *_First <= _E0 + 9;
+ _Seendigit = true, ++_First)
+ if (36 <= _Significant)
+ ++_Pten;
+ else if (*_First == _E0 && _Significant == 0)
+ ;
+ else
+ {
+ *_Ptr++ = (char)((*_First - _E0) + '0');
+ ++_Significant;
+ }
+ else
+ {
+ const _Elem _Kseparator = _Punct_fac.thousands_sep();
+
+ string _Groups((size_t)1, '\0');
+ size_t _Group = 0;
+
+ for (; _First != _Last; ++_First)
+ if (_E0 <= *_First && *_First <= _E0 + 9)
+ {
+ _Seendigit = true;
+ if (36 <= _Significant)
+ ++_Pten;
+ else if (*_First == _E0 && _Significant == 0)
+ ;
+ else
+ {
+ *_Ptr++ = (char)((*_First - _E0) + '0');
+ ++_Significant;
+ }
+ if (_Groups[_Group] != 127)
+ ++_Groups[_Group];
+ }
+ else if (_Groups[_Group] == '\0'
+ || _Kseparator == (_Elem)0
+ || *_First != _Kseparator)
+ break;
+ else
+ {
+ _Groups.append((size_t)1, '\0');
+ ++_Group;
+ }
+ if (_Group == 0)
+ ;
+ else if ('\0' < _Groups[_Group])
+ ++_Group;
+ else
+ _Bad = true;
+
+ for (const char *_Pg = _Grouping.c_str();
+ !_Bad && 0 < _Group; )
+ if (*_Pg == 127)
+ break;
+ else if (0 < --_Group && *_Pg != _Groups[_Group]
+ || 0 == _Group && *_Pg < _Groups[_Group])
+ _Bad = true;
+ else if ('\0' < _Pg[1])
+ ++_Pg;
+ }
+
+ if (_Seendigit && _Significant == 0)
+ *_Ptr++ = '0';
+
+ if (_First != _Last && *_First == _Punct_fac.decimal_point())
+ *_Ptr++ = localeconv()->decimal_point[0], ++_First;
+
+ if (_Significant == 0)
+ {
+ for (; _First != _Last && *_First == _E0;
+ _Seendigit = true, ++_First)
+ --_Pten;
+ if (_Pten < 0)
+ *_Ptr++ = '0', ++_Pten;
+ }
+
+ for (; _First != _Last
+ && _E0 <= *_First && *_First <= _E0 + 9;
+ _Seendigit = true, ++_First)
+ if (_Significant < 36)
+ {
+ *_Ptr++ = (char)((*_First - _E0) + '0');
+ ++_Significant;
+ }
+
+ if (_Seendigit && _First != _Last
+ && (*_First == _Maklocchr('e', (_Elem *)0, _Cvt)
+ || *_First == _Maklocchr('E', (_Elem *)0, _Cvt)))
+ {
+ *_Ptr++ = 'e', ++_First;
+ _Seendigit = false, _Significant = 0;
+
+ if (_First == _Last)
+ ;
+ else if (*_First == _Maklocchr('+', (_Elem *)0, _Cvt))
+ *_Ptr++ = '+', ++_First;
+ else if (*_First == _Maklocchr('-', (_Elem *)0, _Cvt))
+ *_Ptr++ = '-', ++_First;
+ for (; _First != _Last && *_First == _E0; )
+ _Seendigit = true, ++_First;
+ if (_Seendigit)
+ *_Ptr++ = '0';
+ for (; _First != _Last
+ && _E0 <= *_First && *_First <= _E0 + 9;
+ _Seendigit = true, ++_First)
+ if (_Significant < 8)
+ {
+ *_Ptr++ = (char)((*_First - _E0) + '0');
+ ++_Significant;
+ }
+ }
+
+ if (_Bad || !_Seendigit)
+ _Ptr = _Ac;
+ *_Ptr = '\0';
+ return (_Pten);
+ }
+ };
+
+
+template<class _Elem,
+ class _InIt>
+ locale::id num_get<_Elem, _InIt>::id;
+
+
+template<class _Elem,
+ class _OutIt = ostreambuf_iterator<_Elem, char_traits<_Elem> > >
+ class num_put
+ : public locale::facet
+ {
+public:
+ typedef numpunct<_Elem> _Mypunct;
+ typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
+ _Mystr;
+
+ static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
+ {
+ if (_Ppf != 0 && *_Ppf == 0)
+ *_Ppf = new num_put<_Elem, _OutIt>;
+ return (4);
+ }
+
+ static locale::id id;
+
+protected:
+ virtual ~num_put()
+ {
+ }
+
+protected:
+ void _Init(const _Locinfo& _Lobj)
+ {
+ _Cvt = _Lobj._Getcvt();
+ }
+
+ _Locinfo::_Cvtvec _Cvt;
+
+public:
+ explicit num_put(size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ { _Locinfo _Lobj;
+ _Init(_Lobj);
+ }
+ }
+
+ num_put(const _Locinfo& _Lobj, size_t _Refs = 0)
+ : locale::facet(_Refs)
+ {
+ _Init(_Lobj);
+ }
+
+ typedef _Elem char_type;
+ typedef _OutIt iter_type;
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, long _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, __int64 _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, unsigned __int64 _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, double _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, long double _Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+ _OutIt put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, const void *_Val) const
+ {
+ return (do_put(_Dest, _Iosbase, _Fill, _Val));
+ }
+
+protected:
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
+ {
+ ;
+ if (!(_Iosbase.flags() & ios_base::boolalpha))
+ return (do_put(_Dest, _Iosbase, _Fill, (long)_Val));
+ else
+ {
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Iosbase.getloc());
+ _Mystr _Str;
+ if (_Val)
+ _Str.assign(_Punct_fac.truename());
+ else
+ _Str.assign(_Punct_fac.falsename());
+
+ size_t _Fillcount = _Iosbase.width() <= 0
+ || (size_t)_Iosbase.width() <= _Str.size()
+ ? 0 : (size_t)_Iosbase.width() - _Str.size();
+
+ if ((_Iosbase.flags() & ios_base::adjustfield) != ios_base::left)
+ {
+ _Dest = _Rep(_Dest, _Fill, _Fillcount);
+ _Fillcount = 0;
+ }
+ _Dest = _Put(_Dest, _Str.c_str(), _Str.size());
+ _Iosbase.width(0);
+ return (_Rep(_Dest, _Fill, _Fillcount));
+ }
+ }
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, long _Val) const
+ {
+ const size_t _Buf_size = 2 * 32;
+ char _Buf[_Buf_size], _Fmt[6];
+ return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
+ ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "ld",
+ _Iosbase.flags()), _Val)));
+ }
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
+ {
+ const size_t _Buf_size = 2 * 32;
+ char _Buf[_Buf_size], _Fmt[6];
+ return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
+ ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "lu",
+ _Iosbase.flags()), _Val)));
+ }
+
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, __int64 _Val) const
+ {
+ const size_t _Buf_size = 2 * 32;
+ char _Buf[_Buf_size], _Fmt[8];
+ return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
+ ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "Ld",
+ _Iosbase.flags()), _Val)));
+ }
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, unsigned __int64 _Val) const
+ {
+ const size_t _Buf_size = 2 * 32;
+ char _Buf[_Buf_size], _Fmt[8];
+ return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
+ ::sprintf_s(_Buf, _Buf_size, _Ifmt(_Fmt, "Lu",
+ _Iosbase.flags()), _Val)));
+ }
+
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, double _Val) const
+ {
+ const size_t _Buf_size = 8 + 36 + 64;
+ char _Buf[_Buf_size], _Fmt[8];
+ streamsize _Precision = _Iosbase.precision() <= 0
+ && !(_Iosbase.flags() & ios_base::fixed)
+ ? 6 : _Iosbase.precision();
+ int _Significance = 36 < _Precision
+ ? 36 : (int)_Precision;
+ _Precision -= _Significance;
+ size_t _Beforepoint = 0;
+ size_t _Afterpoint = 0;
+
+ if ((_Iosbase.flags() & ios_base::floatfield) == ios_base::fixed)
+ {
+ bool _Signed = _Val < 0;
+ if (_Signed)
+ _Val = -_Val;
+
+ for (; 1e35 <= _Val && _Beforepoint < 5000; _Beforepoint += 10)
+ _Val /= 1e10;
+
+ if (0 < _Val)
+ for (; 10 <= _Precision && _Val <= 1e-35
+ && _Afterpoint < 5000; _Afterpoint += 10)
+ {
+ _Val *= 1e10;
+ _Precision -= 10;
+ }
+
+ if (_Signed)
+ _Val = -_Val;
+ }
+
+ return (_Fput(_Dest, _Iosbase, _Fill, _Buf,
+ _Beforepoint, _Afterpoint, _Precision,
+ ::sprintf_s(_Buf, _Buf_size, _Ffmt(_Fmt, 0, _Iosbase.flags()),
+ _Significance, _Val)));
+ }
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, long double _Val) const
+ {
+ const size_t _Buf_size = 8 + 36 + 64;
+ char _Buf[_Buf_size], _Fmt[8];
+ streamsize _Precision = _Iosbase.precision() <= 0
+ && !(_Iosbase.flags() & ios_base::fixed)
+ ? 6 : _Iosbase.precision();
+ int _Significance = 36 < _Precision
+ ? 36 : (int)_Precision;
+ _Precision -= _Significance;
+ size_t _Beforepoint = 0;
+ size_t _Afterpoint = 0;
+
+ if ((_Iosbase.flags() & ios_base::floatfield) == ios_base::fixed)
+ {
+ bool _Signed = _Val < 0;
+ if (_Signed)
+ _Val = -_Val;
+
+ for (; 1e35 <= _Val && _Beforepoint < 5000; _Beforepoint += 10)
+ _Val /= 1e10;
+
+ if (0 < _Val)
+ for (; 10 <= _Precision && _Val <= 1e-35
+ && _Afterpoint < 5000; _Afterpoint += 10)
+ {
+ _Val *= 1e10;
+ _Precision -= 10;
+ }
+
+ if (_Signed)
+ _Val = -_Val;
+ }
+
+ return (_Fput(_Dest, _Iosbase, _Fill, _Buf,
+ _Beforepoint, _Afterpoint, _Precision,
+ ::sprintf_s(_Buf, _Buf_size, _Ffmt(_Fmt, 'L', _Iosbase.flags()),
+ _Significance, _Val)));
+ }
+
+ virtual _OutIt do_put(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, const void *_Val) const
+ {
+ const size_t _Buf_size = 2 * 32;
+ char _Buf[_Buf_size];
+ return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
+ ::sprintf_s(_Buf, _Buf_size, "%p", _Val)));
+ }
+
+private:
+ char *__cdecl _Ffmt( char *_Fmt,
+ char _Spec, ios_base::fmtflags _Flags) const
+ {
+ char *_Ptr = _Fmt;
+ *_Ptr++ = '%';
+
+ if (_Flags & ios_base::showpos)
+ *_Ptr++ = '+';
+ if (_Flags & ios_base::showpoint)
+ *_Ptr++ = '#';
+ *_Ptr++ = '.';
+ *_Ptr++ = '*';
+ if (_Spec != '\0')
+ *_Ptr++ = _Spec;
+
+ ios_base::fmtflags _Ffl = _Flags & ios_base::floatfield;
+ *_Ptr++ = _Ffl == ios_base::fixed ? 'f'
+ : _Ffl == ios_base::scientific ? 'e' : 'g';
+ *_Ptr = '\0';
+ return (_Fmt);
+ }
+
+ _OutIt __cdecl _Fput(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, const char *_Buf,
+ size_t _Beforepoint, size_t _Afterpoint,
+ size_t _Trailing, size_t _Count) const
+ {
+ ;
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Iosbase.getloc());
+ const string _Grouping = _Punct_fac.grouping();
+ const _Elem _Kseparator = _Punct_fac.thousands_sep();
+ string _Groupstring;
+ const _Elem _E0 = _Maklocchr('0', (_Elem *)0, _Cvt);
+ size_t _Prefix = _Buf[0] == '+' || _Buf[0] == '-' ? 1 : 0;
+
+ char _Enders[3];
+ _Enders[0] = ::localeconv()->decimal_point[0];
+ _Enders[1] = 'e';
+ _Enders[2] = '\0';
+
+ const char *_Eptr = (const char *)::memchr(_Buf,
+ 'e', _Count);
+ const char *_Pointptr = (const char *)::memchr(_Buf,
+ _Enders[0], _Count);
+ if (_Pointptr == 0)
+ _Trailing = 0;
+
+ if (*_Grouping.c_str() != 127 && '\0' < *_Grouping.c_str())
+ {
+ _Groupstring.append(_Buf, _Count);
+ if (_Eptr == 0)
+ _Groupstring.append(_Trailing, '0');
+ else
+ {
+ if (_Pointptr == 0)
+ {
+ _Groupstring.append(_Beforepoint, '0');
+ _Beforepoint = 0;
+ }
+ _Groupstring.insert(_Eptr - _Buf, _Trailing, '0');
+ }
+ _Trailing = 0;
+
+ if (_Pointptr == 0)
+ _Groupstring.append(_Beforepoint, '0');
+ else
+ {
+ _Groupstring.insert(_Pointptr - _Buf + 1, _Afterpoint, '0');
+ _Groupstring.insert(_Pointptr - _Buf, _Beforepoint, '0');
+ _Afterpoint = 0;
+ }
+ _Beforepoint = 0;
+
+ const char *_Pg = _Grouping.c_str();
+ size_t _Off = ::strcspn(&_Groupstring[0], &_Enders[0]);
+ while (*_Pg != 127 && '\0' < *_Pg
+ && (size_t)*_Pg < _Off - _Prefix)
+ {
+ _Groupstring.insert(_Off -= *_Pg, (size_t)1, '\0');
+ if ('\0' < _Pg[1])
+ ++_Pg;
+ }
+
+ _Buf = &_Groupstring[0];
+ _Trailing = 0;
+ _Count = _Groupstring.size();
+ }
+
+ size_t _Fillcount = _Beforepoint + _Afterpoint + _Trailing + _Count;
+ _Fillcount = _Iosbase.width() <= 0
+ || (size_t)_Iosbase.width() <= _Fillcount
+ ? 0 : (size_t)_Iosbase.width() - _Fillcount;
+ ios_base::fmtflags _Adjustfield =
+ _Iosbase.flags() & ios_base::adjustfield;
+ if (_Adjustfield != ios_base::left
+ && _Adjustfield != ios_base::internal)
+ {
+ _Dest = _Rep(_Dest, _Fill, _Fillcount);
+ _Fillcount = 0;
+ }
+ else if (_Adjustfield == ios_base::internal)
+ {
+ if (0 < _Prefix)
+ {
+ _Dest = _Putc(_Dest, _Buf, 1);
+ ++_Buf, --_Count;
+ }
+ _Dest = _Rep(_Dest, _Fill, _Fillcount);
+ _Fillcount = 0;
+ }
+
+ _Pointptr = (const char *)::memchr(_Buf,
+ _Enders[0], _Count);
+ if (_Pointptr != 0)
+ {
+ size_t _Fracoffset = _Pointptr - _Buf + 1;
+ _Dest = _Putgrouped(_Dest, _Buf, _Fracoffset - 1, _Kseparator);
+ _Dest = _Rep(_Dest, _E0, _Beforepoint);
+ _Dest = _Rep(_Dest, _Punct_fac.decimal_point(), 1);
+ _Dest = _Rep(_Dest, _E0, _Afterpoint);
+ _Buf += _Fracoffset, _Count -= _Fracoffset;
+ }
+
+ _Eptr = (const char *)::memchr(_Buf,
+ 'e', _Count);
+ if (_Eptr != 0)
+ {
+ size_t _Expoffset = _Eptr - _Buf + 1;
+ _Dest = _Putgrouped(_Dest, _Buf, _Expoffset - 1, _Kseparator);
+ _Dest = _Rep(_Dest, _E0, _Trailing), _Trailing = 0;
+ _Dest = _Putc(_Dest, _Iosbase.flags() & ios_base::uppercase
+ ? "E" : "e", 1);
+ _Buf += _Expoffset, _Count -= _Expoffset;
+ }
+
+ _Dest = _Putgrouped(_Dest, _Buf, _Count,
+ _Kseparator);
+ _Dest = _Rep(_Dest, _E0, _Trailing);
+ _Iosbase.width(0);
+ return (_Rep(_Dest, _Fill, _Fillcount));
+ }
+
+ char *__cdecl _Ifmt( char *_Fmt,
+ const char *_Spec, ios_base::fmtflags _Flags) const
+ {
+ char *_Ptr = _Fmt;
+ *_Ptr++ = '%';
+
+ if (_Flags & ios_base::showpos)
+ *_Ptr++ = '+';
+ if (_Flags & ios_base::showbase)
+ *_Ptr++ = '#';
+ if (_Spec[0] != 'L')
+ *_Ptr++ = _Spec[0];
+ else
+ {
+ *_Ptr++ = 'I';
+ *_Ptr++ = '6';
+ *_Ptr++ = '4';
+ }
+
+ ios_base::fmtflags _Basefield = _Flags & ios_base::basefield;
+ *_Ptr++ = _Basefield == ios_base::oct ? 'o'
+ : _Basefield != ios_base::hex ? _Spec[1]
+ : _Flags & ios_base::uppercase ? 'X' : 'x';
+ *_Ptr = '\0';
+ return (_Fmt);
+ }
+
+ _OutIt __cdecl _Iput(_OutIt _Dest,
+ ios_base& _Iosbase, _Elem _Fill, char *_Buf, size_t _Count) const
+ {
+ ;
+ const _Mypunct& _Punct_fac = use_facet<_Mypunct >(_Iosbase.getloc());
+ const string _Grouping = _Punct_fac.grouping();
+ const size_t _Prefix = *_Buf == '+' || *_Buf == '-' ? 1
+ : *_Buf == '0' && (_Buf[1] == 'x' || _Buf[1] == 'X') ? 2
+ : 0;
+
+ if (*_Grouping.c_str() != 127 && '\0' < *_Grouping.c_str())
+ {
+ const char *_Pg = _Grouping.c_str();
+ size_t _Off = _Count;
+ while (*_Pg != 127 && '\0' < *_Pg
+ && (size_t)*_Pg < _Off - _Prefix)
+ {
+ _Off -= *_Pg;
+ ::memmove_s((&_Buf[_Off + 1]), (_Count + 1 - _Off), (&_Buf[_Off]), (_Count + 1 - _Off));
+ _Buf[_Off] = '\0', ++_Count;
+ if ('\0' < _Pg[1])
+ ++_Pg;
+ }
+ }
+
+ size_t _Fillcount = _Iosbase.width() <= 0
+ || (size_t)_Iosbase.width() <= _Count
+ ? 0 : (size_t)_Iosbase.width() - _Count;
+
+ ios_base::fmtflags _Adjustfield =
+ _Iosbase.flags() & ios_base::adjustfield;
+ if (_Adjustfield != ios_base::left
+ && _Adjustfield != ios_base::internal)
+ {
+ _Dest = _Rep(_Dest, _Fill, _Fillcount);
+ _Fillcount = 0;
+ }
+ else if (_Adjustfield == ios_base::internal)
+ {
+ _Dest = _Putc(_Dest, _Buf, _Prefix);
+ _Buf += _Prefix, _Count -= _Prefix;
+ _Dest = _Rep(_Dest, _Fill, _Fillcount), _Fillcount = 0;
+ }
+
+ _Dest = _Putgrouped(_Dest, _Buf, _Count,
+ _Punct_fac.thousands_sep());
+ _Iosbase.width(0);
+ return (_Rep(_Dest, _Fill, _Fillcount));
+ }
+
+ _OutIt __cdecl _Put(_OutIt _Dest,
+ const _Elem *_Ptr, size_t _Count) const
+ {
+ for (; 0 < _Count; --_Count, ++_Dest, ++_Ptr)
+ *_Dest = *_Ptr;
+ return (_Dest);
+ }
+
+ _OutIt __cdecl _Putc(_OutIt _Dest,
+ const char *_Ptr, size_t _Count) const
+ {
+ for (; 0 < _Count; --_Count, ++_Dest, ++_Ptr)
+ *_Dest = _Maklocchr(*_Ptr, (_Elem *)0, _Cvt);
+ return (_Dest);
+ }
+
+ _OutIt __cdecl _Putgrouped(_OutIt _Dest,
+ const char *_Ptr, size_t _Count, _Elem _Kseparator) const
+ {
+ for (; ; ++_Ptr, --_Count)
+ {
+ const char *_Pend =
+ (const char *)::memchr(_Ptr, '\0', _Count);
+ size_t _Groupsize = _Pend != 0 ? _Pend - _Ptr : _Count;
+
+ _Dest = _Putc(_Dest, _Ptr, _Groupsize);
+ _Ptr += _Groupsize, _Count -= _Groupsize;
+ if (_Count == 0)
+ break;
+ if (_Kseparator != (_Elem)0)
+ _Dest = _Rep(_Dest, _Kseparator, 1);
+ }
+ return (_Dest);
+ }
+
+ _OutIt __cdecl _Rep(_OutIt _Dest,
+ _Elem _Ch, size_t _Count) const
+ {
+ for (; 0 < _Count; --_Count, ++_Dest)
+ *_Dest = _Ch;
+ return (_Dest);
+ }
+ };
+
+
+template<class _Elem,
+ class _OutIt>
+ locale::id num_put<_Elem, _OutIt>::id;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+template<class _Elem,
+ class _Traits>
+ class basic_ios
+ : public ios_base
+ {
+public:
+ typedef basic_ios<_Elem, _Traits> _Myt;
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ typedef basic_streambuf<_Elem, _Traits> _Mysb;
+ typedef ctype<_Elem> _Ctype;
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+
+ explicit basic_ios(_Mysb *_Strbuf)
+ {
+ init(_Strbuf);
+ }
+
+ virtual ~basic_ios()
+ {
+ }
+
+ void clear(iostate _State = goodbit, bool _Reraise = false)
+ {
+ ios_base::clear((iostate)(_Mystrbuf == 0
+ ? (int)_State | (int)badbit : (int)_State), _Reraise);
+ }
+
+ void clear(io_state _State)
+ {
+ clear((iostate)_State);
+ }
+
+ void setstate(iostate _State, bool _Reraise = false)
+ {
+ if (_State != goodbit)
+ clear((iostate)((int)rdstate() | (int)_State), _Reraise);
+ }
+
+ void setstate(io_state _State)
+ {
+ setstate((iostate)_State);
+ }
+
+ _Myt& copyfmt(const _Myt& _Right)
+ {
+ _Tiestr = _Right.tie();
+ _Fillch = _Right.fill();
+ ios_base::copyfmt(_Right);
+ return (*this);
+ }
+
+ _Myos * tie() const
+ {
+ return (_Tiestr);
+ }
+
+ _Myos * tie(_Myos *_Newtie)
+ {
+ _Myos *_Oldtie = _Tiestr;
+ _Tiestr = _Newtie;
+ return (_Oldtie);
+ }
+
+ _Mysb * rdbuf() const
+ {
+ return (_Mystrbuf);
+ }
+
+ _Mysb * rdbuf(_Mysb *_Strbuf)
+ {
+ _Mysb *_Oldstrbuf = _Mystrbuf;
+ _Mystrbuf = _Strbuf;
+ clear();
+ return (_Oldstrbuf);
+ }
+
+ locale imbue(const locale& _Loc)
+ {
+ locale _Oldlocale = ios_base::imbue(_Loc);
+ if (rdbuf() != 0)
+ rdbuf()->pubimbue(_Loc);
+ return (_Oldlocale);
+ }
+
+ _Elem fill() const
+ {
+ return (_Fillch);
+ }
+
+ _Elem fill(_Elem _Newfill)
+ {
+ _Elem _Oldfill = _Fillch;
+ _Fillch = _Newfill;
+ return (_Oldfill);
+ }
+
+ char narrow(_Elem _Ch, char _Dflt = '\0') const
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(getloc());
+ return (_Ctype_fac.narrow(_Ch, _Dflt));
+ }
+
+ _Elem widen(char _Byte) const
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(getloc());
+ return (_Ctype_fac.widen(_Byte));
+ }
+
+protected:
+ void init(_Mysb *_Strbuf = 0,
+ bool _Isstd = false)
+ {
+ _Init();
+ _Mystrbuf = _Strbuf;
+ _Tiestr = 0;
+ _Fillch = widen(' ');
+
+ if (_Mystrbuf == 0)
+ setstate(badbit);
+
+ if (_Isstd)
+ _Addstd(this);
+ else
+ _Stdstr = 0;
+ }
+
+ basic_ios()
+ {
+ }
+
+private:
+ basic_ios(const _Myt&);
+ _Myt& operator=(const _Myt&);
+
+ _Mysb *_Mystrbuf;
+ _Myos *_Tiestr;
+ _Elem _Fillch;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+inline ios_base& __cdecl boolalpha(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::boolalpha);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl dec(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::dec, ios_base::basefield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl fixed(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::fixed, ios_base::floatfield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl hex(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::hex, ios_base::basefield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl internal(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::internal, ios_base::adjustfield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl left(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::left, ios_base::adjustfield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl noboolalpha(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::boolalpha);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl noshowbase(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::showbase);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl noshowpoint(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::showpoint);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl noshowpos(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::showpos);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl noskipws(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::skipws);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl nounitbuf(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::unitbuf);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl nouppercase(ios_base& _Iosbase)
+ {
+ _Iosbase.unsetf(ios_base::uppercase);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl oct(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::oct, ios_base::basefield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl right(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::right, ios_base::adjustfield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl scientific(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::scientific, ios_base::floatfield);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl showbase(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::showbase);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl showpoint(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::showpoint);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl showpos(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::showpos);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl skipws(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::skipws);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl unitbuf(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::unitbuf);
+ return (_Iosbase);
+ }
+
+inline ios_base& __cdecl uppercase(ios_base& _Iosbase)
+ {
+ _Iosbase.setf(ios_base::uppercase);
+ return (_Iosbase);
+ }
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Elem,
+ class _Traits>
+ class basic_ostream
+ : virtual public basic_ios<_Elem, _Traits>
+ {
+public:
+ typedef basic_ostream<_Elem, _Traits> _Myt;
+ typedef basic_ios<_Elem, _Traits> _Myios;
+ typedef basic_streambuf<_Elem, _Traits> _Mysb;
+ typedef ostreambuf_iterator<_Elem, _Traits> _Iter;
+ typedef num_put<_Elem, _Iter> _Nput;
+
+ explicit basic_ostream(basic_streambuf<_Elem, _Traits> *_Strbuf,
+ bool _Isstd = false)
+ {
+ _Myios::init(_Strbuf, _Isstd);
+ }
+
+ basic_ostream(_Uninitialized)
+ {
+ ios_base::_Addstd(this);
+ }
+
+ basic_ostream(_Uninitialized, bool _Addit)
+ {
+ if (_Addit)
+ ios_base::_Addstd(this);
+ }
+
+ virtual ~basic_ostream()
+ {
+ }
+
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+
+ class _Sentry_base
+ {
+ public:
+ _Sentry_base(_Myt& _Ostr)
+ : _Myostr(_Ostr)
+ {
+ if (_Myostr.rdbuf() != 0)
+ _Myostr.rdbuf()->_Lock();
+ }
+
+ ~_Sentry_base()
+ {
+ if (_Myostr.rdbuf() != 0)
+ _Myostr.rdbuf()->_Unlock();
+ }
+
+ _Myt& _Myostr;
+ };
+
+ class sentry
+ : public _Sentry_base
+ {
+ public:
+ explicit sentry(_Myt& _Ostr)
+ : _Sentry_base(_Ostr)
+ {
+ if (_Ostr.good() && _Ostr.tie() != 0)
+ _Ostr.tie()->flush();
+ _Ok = _Ostr.good();
+ }
+
+ ~sentry()
+ {
+
+
+ if (!std:: uncaught_exception())
+ this->_Myostr._Osfx();
+ }
+
+
+
+
+
+
+ operator bool() const
+ {
+ return (_Ok);
+ }
+
+ private:
+ sentry(const sentry&);
+ sentry& operator=(const sentry&);
+
+ bool _Ok;
+ };
+
+ bool opfx()
+ {
+ if (ios_base::good() && _Myios::tie() != 0)
+ _Myios::tie()->flush();
+ return (ios_base::good());
+ }
+
+ void osfx()
+ {
+ _Osfx();
+ }
+
+ void _Osfx()
+ {
+ try {
+ if (ios_base::flags() & ios_base::unitbuf)
+ flush();
+ } catch (...) {
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _Myt& operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
+ {
+ ;
+ return ((*_Pfn)(*this));
+ }
+
+ _Myt& operator<<(_Myios& (__cdecl *_Pfn)(_Myios&))
+ {
+ ;
+ (*_Pfn)(*(_Myios *)this);
+ return (*this);
+ }
+
+ _Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
+ {
+ ;
+ (*_Pfn)(*(ios_base *)this);
+ return (*this);
+ }
+
+ _Myt& operator<<(_Bool _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(short _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+ ios_base::fmtflags _Bfl =
+ ios_base::flags() & ios_base::basefield;
+ long _Tmp = (_Bfl == ios_base::oct
+ || _Bfl == ios_base::hex)
+ ? (long)(unsigned short)_Val : (long)_Val;
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Tmp).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+
+
+
+
+
+
+
+ _Myt& operator<<(unsigned short _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), (unsigned long)_Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(int __w64 _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+ ios_base::fmtflags _Bfl =
+ ios_base::flags() & ios_base::basefield;
+ long _Tmp = (_Bfl == ios_base::oct
+ || _Bfl == ios_base::hex)
+ ? (long)(unsigned int)_Val : (long)_Val;
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Tmp).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(unsigned int __w64 _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), (unsigned long)_Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(long _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(unsigned long __w64 _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), (unsigned long)_Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+ _Myt& operator<<(__int64 _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(unsigned __int64 _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+ _Myt& operator<<(float _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), (double)_Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(double _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(long double _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(const void *_Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nput& _Nput_fac = use_facet<_Nput >(ios_base::getloc());
+
+ try {
+ if (_Nput_fac.put(_Iter(_Myios::rdbuf()), *this,
+ _Myios::fill(), _Val).failed())
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator<<(_Mysb *_Strbuf)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ bool _Copied = false;
+ const sentry _Ok(*this);
+
+ if (_Ok && _Strbuf != 0)
+ for (int_type _Meta = _Traits::eof(); ; _Copied = true)
+ {
+ try {
+ _Meta = _Traits::eq_int_type(_Traits::eof(), _Meta)
+ ? _Strbuf->sgetc() : _Strbuf->snextc();
+ } catch (...) {
+ _Myios::setstate(ios_base::failbit);
+ throw;
+ }
+
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ break;
+
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Myios::rdbuf()->sputc(
+ _Traits::to_char_type(_Meta))))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ ios_base::width(0);
+ _Myios::setstate(_Strbuf == 0 ? ios_base::badbit
+ : !_Copied ? _State | ios_base::failbit : _State);
+ return (*this);
+ }
+
+ _Myt& put(_Elem _Ch)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Myios::rdbuf()->sputc(_Ch)))
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& write(const _Elem *_Str,
+ streamsize _Count)
+ {
+ ;
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ if (_Myios::rdbuf()->sputn(_Str, _Count) != _Count)
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& flush()
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ if (!ios_base::fail() && _Myios::rdbuf()->pubsync() == -1)
+ _State |= ios_base::badbit;
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& seekp(pos_type _Pos)
+ {
+ if (!ios_base::fail()
+ && (off_type)_Myios::rdbuf()->pubseekpos(_Pos,
+ ios_base::out) == _BADOFF)
+ _Myios::setstate(ios_base::failbit);
+ return (*this);
+ }
+
+ _Myt& seekp(off_type _Off, ios_base::seekdir _Way)
+ {
+ if (!ios_base::fail()
+ && (off_type)_Myios::rdbuf()->pubseekoff(_Off, _Way,
+ ios_base::out) == _BADOFF)
+ _Myios::setstate(ios_base::failbit);
+ return (*this);
+ }
+
+ pos_type tellp()
+ {
+ if (!ios_base::fail())
+ return (_Myios::rdbuf()->pubseekoff(0,
+ ios_base::cur, ios_base::out));
+ else
+ return (pos_type(_BADOFF));
+ }
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>& __cdecl operator<<(
+ basic_ostream<_Elem, _Traits>& _Ostr, const char *_Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ streamsize _Count = (streamsize)::strlen(_Val);
+ streamsize _Pad = _Ostr.width() <= 0 || _Ostr.width() <= _Count
+ ? 0 : _Ostr.width() - _Count;
+ const typename basic_ostream<_Elem, _Traits>::sentry _Ok(_Ostr);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ const ctype<_Elem>& _Ctype_fac = use_facet<ctype<_Elem> >(_Ostr.getloc());
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+
+ for (; _State == ios_base::goodbit && 0 < _Count; --_Count, ++_Val)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ctype_fac.widen(*_Val))))
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+ _Ostr.width(0);
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>& __cdecl operator<<(
+ basic_ostream<_Elem, _Traits>& _Ostr, char _Ch)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const typename basic_ostream<_Elem, _Traits>::sentry _Ok(_Ostr);
+
+ if (_Ok)
+ {
+ const ctype<_Elem>& _Ctype_fac = use_facet<ctype<_Elem> >(_Ostr.getloc());
+ streamsize _Pad = _Ostr.width() <= 1 ? 0 : _Ostr.width() - 1;
+
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit
+ && _Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ctype_fac.widen(_Ch))))
+ _State |= ios_base::badbit;
+
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.width(0);
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr,
+ const char *_Val)
+ {
+ typedef char _Elem;
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ ios_base::iostate _State = ios_base::goodbit;
+ streamsize _Count = (streamsize)_Traits::length(_Val);
+ streamsize _Pad = _Ostr.width() <= 0 || _Ostr.width() <= _Count
+ ? 0 : _Ostr.width() - _Count;
+ const typename _Myos::sentry _Ok(_Ostr);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+
+ if (_State == ios_base::goodbit
+ && _Ostr.rdbuf()->sputn(_Val, _Count) != _Count)
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+ _Ostr.width(0);
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr, char _Ch)
+ {
+ typedef char _Elem;
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ ios_base::iostate _State = ios_base::goodbit;
+ const typename _Myos::sentry _Ok(_Ostr);
+
+ if (_Ok)
+ {
+ streamsize _Pad = _Ostr.width() <= 1 ? 0 : _Ostr.width() - 1;
+
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit
+ && _Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ch)))
+ _State |= ios_base::badbit;
+
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.width(0);
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>& __cdecl operator<<(
+ basic_ostream<_Elem, _Traits>& _Ostr, const _Elem *_Val)
+ {
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ ios_base::iostate _State = ios_base::goodbit;
+ streamsize _Count = (streamsize)_Traits::length(_Val);
+ streamsize _Pad = _Ostr.width() <= 0 || _Ostr.width() <= _Count
+ ? 0 : _Ostr.width() - _Count;
+ const typename _Myos::sentry _Ok(_Ostr);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+
+ if (_State == ios_base::goodbit
+ && _Ostr.rdbuf()->sputn(_Val, _Count) != _Count)
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+ _Ostr.width(0);
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>& __cdecl operator<<(
+ basic_ostream<_Elem, _Traits>& _Ostr, _Elem _Ch)
+ {
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ ios_base::iostate _State = ios_base::goodbit;
+ const typename _Myos::sentry _Ok(_Ostr);
+
+ if (_Ok)
+ {
+ streamsize _Pad = _Ostr.width() <= 1 ? 0 : _Ostr.width() - 1;
+
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+
+ if (_State == ios_base::goodbit
+ && _Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ch)))
+ _State |= ios_base::badbit;
+
+ for (; _State == ios_base::goodbit && 0 < _Pad;
+ --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ _State |= ios_base::badbit;
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.width(0);
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr, const signed char *_Val)
+ {
+ return (_Ostr << (const char *)_Val);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr, signed char _Ch)
+ {
+ return (_Ostr << (char)_Ch);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr, const unsigned char *_Val)
+ {
+ return (_Ostr << (const char *)_Val);
+ }
+
+template<class _Traits> inline
+ basic_ostream<char, _Traits>& __cdecl operator<<(
+ basic_ostream<char, _Traits>& _Ostr, unsigned char _Ch)
+ {
+ return (_Ostr << (char)_Ch);
+ }
+
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>&
+ __cdecl endl(basic_ostream<_Elem, _Traits>& _Ostr)
+ {
+ _Ostr.put(_Ostr.widen('\n'));
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>&
+ __cdecl ends(basic_ostream<_Elem, _Traits>& _Ostr)
+ {
+ _Ostr.put(_Elem());
+ return (_Ostr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_ostream<_Elem, _Traits>&
+ __cdecl flush(basic_ostream<_Elem, _Traits>& _Ostr)
+ {
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+ inline basic_ostream<char, char_traits<char> >&
+ __cdecl endl(basic_ostream<char, char_traits<char> >& _Ostr)
+ {
+ _Ostr.put('\n');
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+ inline basic_ostream<wchar_t, char_traits<wchar_t> >&
+ __cdecl endl(basic_ostream<wchar_t,
+ char_traits<wchar_t> >& _Ostr)
+ {
+ _Ostr.put('\n');
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+
+ inline basic_ostream<char, char_traits<char> >&
+ __cdecl ends(basic_ostream<char, char_traits<char> >& _Ostr)
+ {
+ _Ostr.put('\0');
+ return (_Ostr);
+ }
+
+ inline basic_ostream<wchar_t, char_traits<wchar_t> >&
+ __cdecl ends(basic_ostream<wchar_t,
+ char_traits<wchar_t> >& _Ostr)
+ {
+ _Ostr.put('\0');
+ return (_Ostr);
+ }
+
+
+ inline basic_ostream<char, char_traits<char> >&
+ __cdecl flush(basic_ostream<char, char_traits<char> >& _Ostr)
+ {
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+ inline basic_ostream<wchar_t, char_traits<wchar_t> >&
+ __cdecl flush(basic_ostream<wchar_t,
+ char_traits<wchar_t> >& _Ostr)
+ {
+ _Ostr.flush();
+ return (_Ostr);
+ }
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+template<class _Elem,
+ class _Traits>
+ class basic_istream
+ : virtual public basic_ios<_Elem, _Traits>
+ {
+public:
+ typedef basic_istream<_Elem, _Traits> _Myt;
+ typedef basic_ios<_Elem, _Traits> _Myios;
+ typedef basic_streambuf<_Elem, _Traits> _Mysb;
+ typedef istreambuf_iterator<_Elem, _Traits> _Iter;
+ typedef ctype<_Elem> _Ctype;
+ typedef num_get<_Elem, _Iter> _Nget;
+
+
+ explicit basic_istream(_Mysb *_Strbuf, bool _Isstd = false)
+ : _Chcount(0)
+ {
+ _Myios::init(_Strbuf, _Isstd);
+ }
+
+ basic_istream(_Uninitialized)
+ {
+ ios_base::_Addstd(this);
+ }
+
+ virtual ~basic_istream()
+ {
+ }
+
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+
+
+ class _Sentry_base
+ {
+ public:
+ _Sentry_base(_Myt& _Istr)
+ : _Myistr(_Istr)
+ {
+ if (_Myistr.rdbuf() != 0)
+ _Myistr.rdbuf()->_Lock();
+ }
+
+ ~_Sentry_base()
+ {
+ if (_Myistr.rdbuf() != 0)
+ _Myistr.rdbuf()->_Unlock();
+ }
+
+ _Myt& _Myistr;
+ };
+
+ class sentry
+ : public _Sentry_base
+ {
+ public:
+ explicit sentry(_Myt& _Istr, bool _Noskip = false)
+ : _Sentry_base(_Istr)
+ {
+ _Ok = this->_Myistr._Ipfx(_Noskip);
+ }
+
+ operator bool() const
+ {
+ return (_Ok);
+ }
+
+ private:
+ sentry(const sentry&);
+ sentry& operator=(const sentry&);
+
+ bool _Ok;
+ };
+
+ bool _Ipfx(bool _Noskip = false)
+ {
+ if (ios_base::good())
+ {
+ if (_Myios::tie() != 0)
+ _Myios::tie()->flush();
+
+ if (!_Noskip && ios_base::flags() & ios_base::skipws)
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(ios_base::getloc());
+
+ try {
+ int_type _Meta = _Myios::rdbuf()->sgetc();
+
+ for (; ; _Meta = _Myios::rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _Myios::setstate(ios_base::eofbit);
+ break;
+ }
+ else if (!_Ctype_fac.is(_Ctype::space,
+ _Traits::to_char_type(_Meta)))
+ break;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ if (ios_base::good())
+ return (true);
+ }
+ _Myios::setstate(ios_base::failbit);
+ return (false);
+ }
+
+ bool ipfx(bool _Noskip = false)
+ {
+ return _Ipfx(_Noskip);
+ }
+
+ void isfx()
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _Myt& operator>>(_Myt& (__cdecl *_Pfn)(_Myt&))
+ {
+ ;
+ return ((*_Pfn)(*this));
+ }
+
+ _Myt& operator>>(_Myios& (__cdecl *_Pfn)(_Myios&))
+ {
+ ;
+ (*_Pfn)(*(_Myios *)this);
+ return (*this);
+ }
+
+ _Myt& operator>>(ios_base& (__cdecl *_Pfn)(ios_base&))
+ {
+ ;
+ (*_Pfn)(*(ios_base *)this);
+ return (*this);
+ }
+
+ _Myt& operator>>(_Bool& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(short& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ long _Tmp = 0;
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Tmp);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+
+ if (_State & ios_base::failbit
+ || _Tmp < (-32768) || 32767 < _Tmp)
+ _State |= ios_base::failbit;
+ else
+ _Val = (short)_Tmp;
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+
+
+
+
+
+
+
+ _Myt& operator>>(unsigned short& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(int& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ long _Tmp = 0;
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Tmp);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+
+ if (_State & ios_base::failbit
+ || _Tmp < (-2147483647 - 1) || 2147483647 < _Tmp)
+ _State |= ios_base::failbit;
+ else
+ _Val = _Tmp;
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(unsigned int& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(long& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(unsigned long __w64& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, (unsigned long)_Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+ _Myt& operator>>(__int64& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(unsigned __int64& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+
+ _Myt& operator>>(float& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(double& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(long double& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(void *& _Val)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const sentry _Ok(*this);
+
+ if (_Ok)
+ {
+ const _Nget& _Nget_fac = use_facet<_Nget >(ios_base::getloc());
+
+ try {
+ _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
+ *this, _State, _Val);
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& operator>>(_Mysb *_Strbuf)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ bool _Copied = false;
+ const sentry _Ok(*this);
+
+ if (_Ok && _Strbuf != 0)
+ {
+ try {
+ int_type _Meta = _Myios::rdbuf()->sgetc();
+
+ for (; ; _Meta = _Myios::rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else
+ {
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Strbuf->sputc(_Traits::to_char_type(_Meta))))
+ break;
+ } catch (...) {
+ break;
+ }
+ _Copied = true;
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(!_Copied ? _State | ios_base::failbit : _State);
+ return (*this);
+ }
+
+ int_type get()
+ {
+ int_type _Meta = 0;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (!_Ok)
+ _Meta = _Traits::eof();
+ else
+ {
+ try {
+ _Meta = _Myios::rdbuf()->sbumpc();
+
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ _State |= ios_base::eofbit | ios_base::failbit;
+ else
+ ++_Chcount;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (_Meta);
+ }
+
+ _Myt& get(_Elem *_Str, streamsize _Count)
+ {
+ return (get(_Str, _Count, _Myios::widen('\n')));
+ }
+
+ _Myt& get(_Elem *_Str,
+ streamsize _Count, _Elem _Delim)
+ {
+ ;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok && 0 < _Count)
+ {
+ try {
+ int_type _Meta = _Myios::rdbuf()->sgetc();
+
+ for (; 0 < --_Count; _Meta = _Myios::rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (_Traits::to_char_type(_Meta) == _Delim)
+ break;
+ else
+ {
+ *_Str++ = _Traits::to_char_type(_Meta);
+ ++_Chcount;
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_Chcount == 0
+ ? _State | ios_base::failbit : _State);
+ *_Str = _Elem();
+ return (*this);
+ }
+
+ _Myt& get(_Elem& _Ch)
+ {
+ int_type _Meta = get();
+ if (!_Traits::eq_int_type(_Traits::eof(), _Meta))
+ _Ch = _Traits::to_char_type(_Meta);
+ return (*this);
+ }
+
+ _Myt& get(_Mysb& _Strbuf)
+ {
+ return (get(_Strbuf, _Myios::widen('\n')));
+ }
+
+ _Myt& get(_Mysb& _Strbuf, _Elem _Delim)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok)
+ {
+ try {
+ int_type _Meta = _Myios::rdbuf()->sgetc();
+
+ for (; ; _Meta = _Myios::rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else
+ {
+ try {
+ _Elem _Ch = _Traits::to_char_type(_Meta);
+ if (_Ch == _Delim
+ || _Traits::eq_int_type(_Traits::eof(),
+ _Strbuf.sputc(_Ch)))
+ break;
+ } catch (...) {
+ break;
+ }
+ ++_Chcount;
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ if (_Chcount == 0)
+ _State |= ios_base::failbit;
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& getline(_Elem *_Str, streamsize _Count)
+ {
+ return (getline(_Str, _Count, _Myios::widen('\n')));
+ }
+
+ _Myt& getline(_Elem *_Str,
+ streamsize _Count, _Elem _Delim)
+ {
+ ;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok && 0 < _Count)
+ {
+ int_type _Metadelim = _Traits::to_int_type(_Delim);
+
+ try {
+ int_type _Meta = _Myios::rdbuf()->sgetc();
+
+ for (; ; _Meta = _Myios::rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (_Meta == _Metadelim)
+ {
+ ++_Chcount;
+ _Myios::rdbuf()->sbumpc();
+ break;
+ }
+ else if (--_Count <= 0)
+ {
+ _State |= ios_base::failbit;
+ break;
+ }
+ else
+ {
+ ++_Chcount;
+ *_Str++ = _Traits::to_char_type(_Meta);
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ *_Str = _Elem();
+ _Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
+ return (*this);
+ }
+
+ _Myt& ignore(streamsize _Count = 1,
+ int_type _Metadelim = _Traits::eof())
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok && 0 < _Count)
+ {
+ try {
+ for (; ; )
+ {
+ int_type _Meta;
+ if (_Count != 2147483647 && --_Count < 0)
+ break;
+ else if (_Traits::eq_int_type(_Traits::eof(),
+ _Meta = _Myios::rdbuf()->sbumpc()))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else
+ {
+ ++_Chcount;
+ if (_Meta == _Metadelim)
+ break;
+ }
+ }
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& _Read_s(_Elem *_Str, size_t _Str_size, streamsize _Count)
+ {
+ ;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok)
+ {
+ try {
+ const streamsize _Num = _Myios::rdbuf()->_Sgetn_s(_Str, _Str_size, _Count);
+ _Chcount += _Num;
+ if (_Num != _Count)
+ _State |= ios_base::eofbit | ios_base::failbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& read(_Elem *_Str, streamsize _Count)
+ {
+ return _Read_s(_Str, (size_t)-1, _Count);
+ }
+
+ streamsize _Readsome_s(_Elem *_Str, size_t _Str_size, streamsize _Count)
+ {
+ ;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+ streamsize _Num;
+
+ if (!_Ok)
+ _State |= ios_base::failbit;
+ else if ((_Num = _Myios::rdbuf()->in_avail()) < 0)
+ _State |= ios_base::eofbit;
+ else if (0 < _Num)
+ _Read_s(_Str, _Str_size, _Num < _Count ? _Num : _Count);
+
+ _Myios::setstate(_State);
+ return (gcount());
+ }
+
+ __declspec(deprecated("Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. " "To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'"))
+ streamsize readsome(_Elem *_Str, streamsize _Count)
+ {
+ return _Readsome_s(_Str, (size_t)-1, _Count);
+ }
+
+ int_type peek()
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ int_type _Meta = 0;
+ const sentry _Ok(*this, true);
+
+ if (!_Ok)
+ _Meta = _Traits::eof();
+ else
+ {
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Meta = _Myios::rdbuf()->sgetc()))
+ _State |= ios_base::eofbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (_Meta);
+ }
+
+ _Myt& putback(_Elem _Ch)
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok)
+ {
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Myios::rdbuf()->sputbackc(_Ch)))
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ _Myt& unget()
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ _Chcount = 0;
+ const sentry _Ok(*this, true);
+
+ if (_Ok)
+ {
+ try {
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Myios::rdbuf()->sungetc()))
+ _State |= ios_base::badbit;
+ } catch (...) { _Myios::setstate(ios_base::badbit, true); }
+ }
+
+ _Myios::setstate(_State);
+ return (*this);
+ }
+
+ streamsize gcount() const
+ {
+ return (_Chcount);
+ }
+
+ int sync()
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ int _Ans;
+
+ if (_Myios::rdbuf() == 0)
+ _Ans = -1;
+ else if (_Myios::rdbuf()->pubsync() == -1)
+ {
+ _State |= ios_base::badbit;
+ _Ans = -1;
+ }
+ else
+ _Ans = 0;
+
+ _Myios::setstate(_State);
+ return (_Ans);
+ }
+
+ _Myt& seekg(pos_type _Pos)
+ {
+ if (!ios_base::fail()
+ && (off_type)_Myios::rdbuf()->pubseekpos(_Pos,
+ ios_base::in) == _BADOFF)
+ _Myios::setstate(ios_base::failbit);
+ return (*this);
+ }
+
+ _Myt& seekg(off_type _Off, ios_base::seekdir _Way)
+ {
+ if (!ios_base::fail()
+ && (off_type)_Myios::rdbuf()->pubseekoff(_Off, _Way,
+ ios_base::in) == _BADOFF)
+ _Myios::setstate(ios_base::failbit);
+ return (*this);
+ }
+
+ pos_type tellg()
+ {
+ if (!ios_base::fail())
+ return (_Myios::rdbuf()->pubseekoff(0,
+ ios_base::cur, ios_base::in));
+ else
+ return (pos_type(_BADOFF));
+ }
+
+private:
+ streamsize _Chcount;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Elem,
+ class _Traits>
+ class basic_iostream
+ : public basic_istream<_Elem, _Traits>,
+ public basic_ostream<_Elem, _Traits>
+ {
+public:
+ typedef _Elem char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+
+ explicit basic_iostream(basic_streambuf<_Elem, _Traits> *_Strbuf)
+ : basic_istream<_Elem, _Traits>(_Strbuf, false),
+ basic_ostream<_Elem, _Traits>(_Noinit, false)
+ {
+ }
+
+ virtual ~basic_iostream()
+ {
+ }
+ };
+
+
+
+
+
+
+
+
+
+
+
+template<class _Elem,
+ class _Traits> inline
+ basic_istream<_Elem, _Traits>& __cdecl operator>>(
+ basic_istream<_Elem, _Traits>& _Istr, _Elem *_Str)
+ {
+ ;
+ typedef basic_istream<_Elem, _Traits> _Myis;
+ typedef ctype<_Elem> _Ctype;
+ ios_base::iostate _State = ios_base::goodbit;
+ _Elem *_Str0 = _Str;
+ const typename _Myis::sentry _Ok(_Istr);
+
+ if (_Ok)
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(_Istr.getloc());
+
+ try {
+ streamsize _Count = 0 < _Istr.width() ? _Istr.width() : 2147483647;
+ typename _Myis::int_type _Meta = _Istr.rdbuf()->sgetc();
+ _Elem _Ch;
+ for (; 0 < --_Count; _Meta = _Istr.rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (_Ctype_fac.is(_Ctype::space,
+ _Ch = _Traits::to_char_type(_Meta))
+ || _Ch == _Elem())
+ break;
+ else
+ *_Str++ = _Traits::to_char_type(_Meta);
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ *_Str = _Elem();
+ _Istr.width(0);
+ _Istr.setstate(_Str == _Str0 ? _State | ios_base::failbit : _State);
+ return (_Istr);
+ }
+
+template<class _Elem,
+ class _Traits> inline
+ basic_istream<_Elem, _Traits>& __cdecl operator>>(
+ basic_istream<_Elem, _Traits>& _Istr, _Elem& _Ch)
+ {
+ typedef basic_istream<_Elem, _Traits> _Myis;
+ typename _Myis::int_type _Meta;
+ ios_base::iostate _State = ios_base::goodbit;
+ const typename _Myis::sentry _Ok(_Istr);
+
+ if (_Ok)
+ {
+ try {
+ _Meta = _Istr.rdbuf()->sbumpc();
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ _State |= ios_base::eofbit | ios_base::failbit;
+ else
+ _Ch = _Traits::to_char_type(_Meta);
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ _Istr.setstate(_State);
+ return (_Istr);
+ }
+
+template<class _Traits> inline
+ basic_istream<char, _Traits>& __cdecl operator>>(
+ basic_istream<char, _Traits>& _Istr, signed char *_Str)
+ {
+ return (_Istr >> (char *)_Str);
+ }
+
+template<class _Traits> inline
+ basic_istream<char, _Traits>& __cdecl operator>>(
+ basic_istream<char, _Traits>& _Istr, signed char& _Ch)
+ {
+ return (_Istr >> (char&)_Ch);
+ }
+
+template<class _Traits> inline
+ basic_istream<char, _Traits>& __cdecl operator>>(
+ basic_istream<char, _Traits>& _Istr, unsigned char *_Str)
+ {
+ return (_Istr >> (char *)_Str);
+ }
+
+template<class _Traits> inline
+ basic_istream<char, _Traits>& __cdecl operator>>(
+ basic_istream<char, _Traits>& _Istr, unsigned char& _Ch)
+ {
+ return (_Istr >> (char&)_Ch);
+ }
+
+
+template<class _Elem,
+ class _Traits> inline
+ basic_istream<_Elem, _Traits>&
+ __cdecl ws(basic_istream<_Elem, _Traits>& _Istr)
+ {
+ typedef basic_istream<_Elem, _Traits> _Myis;
+ typedef ctype<_Elem> _Ctype;
+
+ if (!_Istr.eof())
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const typename _Myis::sentry _Ok(_Istr, true);
+
+ if (_Ok)
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(_Istr.getloc());
+
+ try {
+ for (typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc(); ;
+ _Meta = _Istr.rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (!_Ctype_fac.is(_Ctype::space,
+ _Traits::to_char_type(_Meta)))
+ break;
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ _Istr.setstate(_State);
+ }
+ return (_Istr);
+ }
+
+ inline basic_istream<char, char_traits<char> >&
+ __cdecl ws(basic_istream<char, char_traits<char> >& _Istr)
+ {
+ typedef char _Elem;
+ typedef char_traits<_Elem> _Traits;
+
+ if (!_Istr.eof())
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const basic_istream<_Elem, _Traits>::sentry _Ok(_Istr, true);
+
+ if (_Ok)
+ {
+ const ctype<_Elem>& _Ctype_fac =
+ use_facet<ctype<_Elem> >(_Istr.getloc());
+
+ try {
+ for (_Traits::int_type _Meta = _Istr.rdbuf()->sgetc(); ;
+ _Meta = _Istr.rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (!_Ctype_fac.is(ctype<_Elem>::space,
+ _Traits::to_char_type(_Meta)))
+ break;
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ _Istr.setstate(_State);
+ }
+ return (_Istr);
+ }
+
+ inline basic_istream<wchar_t, char_traits<wchar_t> >&
+ __cdecl ws(basic_istream<wchar_t, char_traits<wchar_t> >& _Istr)
+ {
+ typedef wchar_t _Elem;
+ typedef char_traits<_Elem> _Traits;
+
+ if (!_Istr.eof())
+ {
+ ios_base::iostate _State = ios_base::goodbit;
+ const basic_istream<_Elem, _Traits>::sentry _Ok(_Istr, true);
+
+ if (_Ok)
+ {
+ const ctype<_Elem>& _Ctype_fac =
+ use_facet<ctype<_Elem> >(_Istr.getloc());
+
+ try {
+ for (_Traits::int_type _Meta = _Istr.rdbuf()->sgetc(); ;
+ _Meta = _Istr.rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (!_Ctype_fac.is(ctype<_Elem>::space,
+ _Traits::to_char_type(_Meta)))
+ break;
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ _Istr.setstate(_State);
+ }
+ return (_Istr);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+ #pragma warning(disable: 4189)
+
+
+namespace std {
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_string<_Elem, _Traits, _Alloc> __cdecl operator+(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_string<_Elem, _Traits, _Alloc> __cdecl operator+(
+ const _Elem *_Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_string<_Elem, _Traits, _Alloc> __cdecl operator+(
+ const _Elem _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (basic_string<_Elem, _Traits, _Alloc>(1, _Left) += _Right);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_string<_Elem, _Traits, _Alloc> __cdecl operator+(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_string<_Elem, _Traits, _Alloc> __cdecl operator+(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem _Right)
+ {
+ return (basic_string<_Elem, _Traits, _Alloc>(_Left) += _Right);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator==(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Left.compare(_Right) == 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator==(
+ const _Elem * _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Right.compare(_Left) == 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator==(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (_Left.compare(_Right) == 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator!=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator!=(
+ const _Elem *_Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator!=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (!(_Left == _Right));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Left.compare(_Right) < 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<(
+ const _Elem * _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Right.compare(_Left) > 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (_Left.compare(_Right) < 0);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>(
+ const _Elem * _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (_Right < _Left);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<=(
+ const _Elem * _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator<=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (!(_Right < _Left));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Left < _Right));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>=(
+ const _Elem * _Left,
+ const basic_string<_Elem, _Traits, _Alloc>& _Right)
+ {
+ return (!(_Left < _Right));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ bool __cdecl operator>=(
+ const basic_string<_Elem, _Traits, _Alloc>& _Left,
+ const _Elem *_Right)
+ {
+ return (!(_Left < _Right));
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_istream<_Elem, _Traits>& __cdecl operator>>(
+ basic_istream<_Elem, _Traits>& _Istr,
+ basic_string<_Elem, _Traits, _Alloc>& _Str)
+ {
+ typedef ctype<_Elem> _Ctype;
+ typedef basic_istream<_Elem, _Traits> _Myis;
+ typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
+ typedef typename _Mystr::size_type _Mysizt;
+
+ ios_base::iostate _State = ios_base::goodbit;
+ bool _Changed = false;
+ const typename _Myis::sentry _Ok(_Istr);
+
+ if (_Ok)
+ {
+ const _Ctype& _Ctype_fac = use_facet<_Ctype >(_Istr.getloc());
+ _Str.erase();
+
+ try {
+ _Mysizt _Size = 0 < _Istr.width()
+ && (_Mysizt)_Istr.width() < _Str.max_size()
+ ? (_Mysizt)_Istr.width() : _Str.max_size();
+ typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
+
+ for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
+ if(_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (_Ctype_fac.is(_Ctype::space,
+ _Traits::to_char_type(_Meta)))
+ break;
+ else
+ {
+ _Str.append(1, _Traits::to_char_type(_Meta));
+ _Changed = true;
+ }
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ _Istr.width(0);
+ if (!_Changed)
+ _State |= ios_base::failbit;
+ _Istr.setstate(_State);
+ return (_Istr);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_istream<_Elem, _Traits>& __cdecl getline(
+ basic_istream<_Elem, _Traits>& _Istr,
+ basic_string<_Elem, _Traits, _Alloc>& _Str,
+ const _Elem _Delim)
+ {
+ typedef basic_istream<_Elem, _Traits> _Myis;
+ ios_base::iostate _State = ios_base::goodbit;
+ bool _Changed = false;
+ const typename _Myis::sentry _Ok(_Istr, true);
+
+ if (_Ok)
+ {
+ try {
+ _Str.erase();
+ const typename _Traits::int_type _Metadelim =
+ _Traits::to_int_type(_Delim);
+ typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
+
+ for (; ; _Meta = _Istr.rdbuf()->snextc())
+ if (_Traits::eq_int_type(_Traits::eof(), _Meta))
+ {
+ _State |= ios_base::eofbit;
+ break;
+ }
+ else if (_Traits::eq_int_type(_Meta, _Metadelim))
+ {
+ _Changed = true;
+ _Istr.rdbuf()->sbumpc();
+ break;
+ }
+ else if (_Str.max_size() <= _Str.size())
+ {
+ _State |= ios_base::failbit;
+ break;
+ }
+ else
+ {
+ _Str += _Traits::to_char_type(_Meta);
+ _Changed = true;
+ }
+ } catch (...) { (_Istr).setstate(ios_base::badbit, true); }
+ }
+
+ if (!_Changed)
+ _State |= ios_base::failbit;
+ _Istr.setstate(_State);
+ return (_Istr);
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_istream<_Elem, _Traits>& __cdecl getline(
+ basic_istream<_Elem, _Traits>& _Istr,
+ basic_string<_Elem, _Traits, _Alloc>& _Str)
+ {
+ return (getline(_Istr, _Str, _Istr.widen('\n')));
+ }
+
+template<class _Elem,
+ class _Traits,
+ class _Alloc> inline
+ basic_ostream<_Elem, _Traits>& __cdecl operator<<(
+ basic_ostream<_Elem, _Traits>& _Ostr,
+ const basic_string<_Elem, _Traits, _Alloc>& _Str)
+ {
+ typedef basic_ostream<_Elem, _Traits> _Myos;
+ typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
+ typedef typename _Mystr::size_type _Mysizt;
+
+ ios_base::iostate _State = ios_base::goodbit;
+ _Mysizt _Size = _Str.size();
+ _Mysizt _Pad = _Ostr.width() <= 0 || (_Mysizt)_Ostr.width() <= _Size
+ ? 0 : (_Mysizt)_Ostr.width() - _Size;
+ const typename _Myos::sentry _Ok(_Ostr);
+
+ if (!_Ok)
+ _State |= ios_base::badbit;
+ else
+ {
+ try {
+ if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+
+ if (_State == ios_base::goodbit)
+ for (_Mysizt _Count = 0; _Count < _Size; ++_Count)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Str[_Count])))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+
+ if (_State == ios_base::goodbit)
+ for (; 0 < _Pad; --_Pad)
+ if (_Traits::eq_int_type(_Traits::eof(),
+ _Ostr.rdbuf()->sputc(_Ostr.fill())))
+ {
+ _State |= ios_base::badbit;
+ break;
+ }
+ _Ostr.width(0);
+ } catch (...) { (_Ostr).setstate(ios_base::badbit, true); }
+ }
+
+ _Ostr.setstate(_State);
+ return (_Ostr);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+ #pragma warning(default: 4189)
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+namespace detail
+{
+
+
+
+
+
+
+
+typedef std::type_info sp_typeinfo;
+
+
+
+}
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+ void __cdecl _wassert( const wchar_t * _Message, const wchar_t *_File, unsigned _Line);
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+namespace std {
+
+
+
+ extern istream *_Ptr_cin;
+ extern ostream *_Ptr_cout;
+ extern ostream *_Ptr_cerr;
+ extern ostream *_Ptr_clog;
+
+
+
+
+class _Winit {
+public:
+ __thiscall _Winit();
+ __thiscall ~_Winit();
+private:
+ static int _Init_cnt;
+ };
+
+
+
+
+ extern wistream *_Ptr_wcin;
+ extern wostream *_Ptr_wcout;
+ extern wostream *_Ptr_wcerr;
+ extern wostream *_Ptr_wclog;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern istream cin;
+ extern ostream cout;
+ extern ostream cerr;
+ extern ostream clog;
+
+ extern wistream wcin;
+ extern wostream wcout;
+ extern wostream wcerr;
+ extern wostream wclog;
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ namespace boost
+ {
+ namespace assertion
+ {
+ namespace detail
+ {
+ inline void assertion_failed_msg(char const * expr, char const * msg, char const * function,
+ char const * file, long line)
+ {
+ std::cerr
+ << "***** Internal Program Error - assertion (" << expr << ") failed in "
+ << function << ":\n"
+ << file << '(' << line << "): " << msg << std::endl;
+
+
+
+
+ std::abort();
+
+ }
+ }
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+#pragma once
+
+
+
+
+
+extern "C" {
+
+
+
+#pragma pack(push,8)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef union
+ {
+ unsigned short _Word[8];
+ float _Float;
+ double _Double;
+ long double _Long_double;
+ } _Dconst;
+
+
+void __cdecl _Feraise(int);
+
+
+ double __cdecl _Cosh(double, double);
+ short __cdecl _Dtest(double *);
+ short __cdecl _Exp(double *, double, short);
+ double __cdecl _Sinh(double, double);
+extern _Dconst _Denorm, _Hugeval, _Inf,
+ _Nan, _Snan;
+
+
+ float __cdecl _FCosh(float, float);
+ short __cdecl _FDtest(float *);
+ short __cdecl _FExp(float *, float, short);
+ float __cdecl _FSinh(float, float);
+extern _Dconst _FDenorm, _FInf, _FNan, _FSnan;
+
+
+ long double __cdecl _LCosh(long double, long double);
+ short __cdecl _LDtest(long double *);
+ short __cdecl _LExp(long double *, long double, short);
+ long double __cdecl _LSinh(long double, long double);
+extern _Dconst _LDenorm, _LInf, _LNan, _LSnan;
+
+}
+
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ unsigned int __cdecl _clearfp(void);
+#pragma warning(push)
+#pragma warning(disable: 4141)
+ __declspec(deprecated("This function or variable may be unsafe. Consider using " "_controlfp_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) unsigned int __cdecl _controlfp( unsigned int _NewValue, unsigned int _Mask);
+#pragma warning(pop)
+ void __cdecl _set_controlfp( unsigned int _NewValue, unsigned int _Mask);
+ errno_t __cdecl _controlfp_s( unsigned int *_CurrentState, unsigned int _NewValue, unsigned int _Mask);
+ unsigned int __cdecl _statusfp(void);
+ void __cdecl _fpreset(void);
+
+
+ void __cdecl _statusfp2( unsigned int *_X86_status, unsigned int *_SSE2_status);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ unsigned int __cdecl _control87( unsigned int _NewValue, unsigned int _Mask);
+
+ int __cdecl __control87_2( unsigned int _NewValue, unsigned int _Mask,
+ unsigned int* _X86_cw, unsigned int* _Sse2_cw);
+
+
+
+
+
+ extern int * __cdecl __fpecode(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ double __cdecl _copysign ( double _Number, double _Sign);
+ double __cdecl _chgsign ( double _X);
+
+
+ double __cdecl _scalb( double _X, long _Y);
+ double __cdecl _logb( double _X);
+ double __cdecl _nextafter( double _X, double _Y);
+ int __cdecl _finite( double _X);
+ int __cdecl _isnan( double _X);
+ int __cdecl _fpclass( double _X);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ void __cdecl fpreset(void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+
+
+
+extern "C" {
+
+
+
+
+
+
+
+
+
+struct _exception {
+ int type;
+ char *name;
+ double arg1;
+ double arg2;
+ double retval;
+ } ;
+
+
+
+
+
+
+
+
+
+
+struct _complex {
+ double x,y;
+ } ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern double _HUGE;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ double __cdecl acos( double _X);
+ double __cdecl asin( double _X);
+ double __cdecl atan( double _X);
+ double __cdecl atan2( double _Y, double _X);
+
+
+
+
+
+ double __cdecl cos( double _X);
+ double __cdecl cosh( double _X);
+ double __cdecl exp( double _X);
+ double __cdecl fabs( double _X);
+ double __cdecl fmod( double _X, double _Y);
+ double __cdecl log( double _X);
+ double __cdecl log10( double _X);
+ double __cdecl pow( double _X, double _Y);
+ double __cdecl sin( double _X);
+ double __cdecl sinh( double _X);
+ double __cdecl tan( double _X);
+ double __cdecl tanh( double _X);
+ double __cdecl sqrt( double _X);
+
+
+
+
+
+
+ double __cdecl _cabs( struct _complex _Complex);
+ double __cdecl ceil( double _X);
+ double __cdecl floor( double _X);
+ double __cdecl frexp( double _X, int * _Y);
+ double __cdecl _hypot( double _X, double _Y);
+ double __cdecl _j0( double _X );
+ double __cdecl _j1( double _X );
+ double __cdecl _jn(int _X, double _Y);
+ double __cdecl ldexp( double _X, int _Y);
+
+
+
+
+
+ int __cdecl _matherr( struct _exception * _Except);
+
+
+ double __cdecl modf( double _X, double * _Y);
+
+ double __cdecl _y0( double _X);
+ double __cdecl _y1( double _X);
+ double __cdecl _yn( int _X, double _Y);
+
+
+
+
+ int __cdecl _set_SSE2_enable( int _Flag);
+ float __cdecl _hypotf( float _X, float _Y);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+inline long double acosl( long double _X)
+ {return (acos((double)_X)); }
+inline long double asinl( long double _X)
+ {return (asin((double)_X)); }
+inline long double atanl( long double _X)
+ {return (atan((double)_X)); }
+inline long double atan2l( long double _X, long double _Y)
+ {return (atan2((double)_X, (double)_Y)); }
+inline long double ceill( long double _X)
+ {return (ceil((double)_X)); }
+inline long double cosl( long double _X)
+ {return (cos((double)_X)); }
+inline long double coshl( long double _X)
+ {return (cosh((double)_X)); }
+inline long double expl( long double _X)
+ {return (exp((double)_X)); }
+inline long double fabsl( long double _X)
+ {return (fabs((double)_X)); }
+inline long double floorl( long double _X)
+ {return (floor((double)_X)); }
+inline long double fmodl( long double _X, long double _Y)
+ {return (fmod((double)_X, (double)_Y)); }
+inline long double frexpl( long double _X, int *_Y)
+ {return (frexp((double)_X, _Y)); }
+inline long double ldexpl( long double _X, int _Y)
+ {return (ldexp((double)_X, _Y)); }
+inline long double logl( long double _X)
+ {return (log((double)_X)); }
+inline long double log10l( long double _X)
+ {return (log10((double)_X)); }
+inline long double modfl( long double _X, long double *_Y)
+ {double _Di, _Df = modf((double)_X, &_Di);
+ *_Y = (long double)_Di;
+ return (_Df); }
+inline long double powl( long double _X, long double _Y)
+ {return (pow((double)_X, (double)_Y)); }
+inline long double sinl( long double _X)
+ {return (sin((double)_X)); }
+inline long double sinhl( long double _X)
+ {return (sinh((double)_X)); }
+inline long double sqrtl( long double _X)
+ {return (sqrt((double)_X)); }
+
+inline long double tanl( long double _X)
+ {return (tan((double)_X)); }
+
+
+
+
+inline long double tanhl( long double _X)
+ {return (tanh((double)_X)); }
+
+inline long double _chgsignl( long double _Number)
+{
+ return _chgsign(static_cast<double>(_Number));
+}
+
+inline long double _copysignl( long double _Number, long double _Sign)
+{
+ return _copysign(static_cast<double>(_Number), static_cast<double>(_Sign));
+}
+
+inline float frexpf( float _X, int *_Y)
+ {return ((float)frexp((double)_X, _Y)); }
+
+
+inline float fabsf( float _X)
+ {return ((float)fabs((double)_X)); }
+inline float ldexpf( float _X, int _Y)
+ {return ((float)ldexp((double)_X, _Y)); }
+
+inline float acosf( float _X)
+ {return ((float)acos((double)_X)); }
+inline float asinf( float _X)
+ {return ((float)asin((double)_X)); }
+inline float atanf( float _X)
+ {return ((float)atan((double)_X)); }
+inline float atan2f( float _X, float _Y)
+ {return ((float)atan2((double)_X, (double)_Y)); }
+inline float ceilf( float _X)
+ {return ((float)ceil((double)_X)); }
+inline float cosf( float _X)
+ {return ((float)cos((double)_X)); }
+inline float coshf( float _X)
+ {return ((float)cosh((double)_X)); }
+inline float expf( float _X)
+ {return ((float)exp((double)_X)); }
+inline float floorf( float _X)
+ {return ((float)floor((double)_X)); }
+inline float fmodf( float _X, float _Y)
+ {return ((float)fmod((double)_X, (double)_Y)); }
+inline float logf( float _X)
+ {return ((float)log((double)_X)); }
+inline float log10f( float _X)
+ {return ((float)log10((double)_X)); }
+inline float modff( float _X, float *_Y)
+ { double _Di, _Df = modf((double)_X, &_Di);
+ *_Y = (float)_Di;
+ return ((float)_Df); }
+inline float powf( float _X, float _Y)
+ {return ((float)pow((double)_X, (double)_Y)); }
+inline float sinf( float _X)
+ {return ((float)sin((double)_X)); }
+inline float sinhf( float _X)
+ {return ((float)sinh((double)_X)); }
+inline float sqrtf( float _X)
+ {return ((float)sqrt((double)_X)); }
+inline float tanf( float _X)
+ {return ((float)tan((double)_X)); }
+inline float tanhf( float _X)
+ {return ((float)tanh((double)_X)); }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ extern double HUGE;
+
+
+
+
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_cabs" ". See online help for details.")) double __cdecl cabs( struct _complex _X);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_hypot" ". See online help for details.")) double __cdecl hypot( double _X, double _Y);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_j0" ". See online help for details.")) double __cdecl j0( double _X);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_j1" ". See online help for details.")) double __cdecl j1( double _X);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_jn" ". See online help for details.")) double __cdecl jn( int _X, double _Y);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_y0" ". See online help for details.")) double __cdecl y0( double _X);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_y1" ". See online help for details.")) double __cdecl y1( double _X);
+__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_yn" ". See online help for details.")) double __cdecl yn( int _X, double _Y);
+
+
+
+
+
+
+}
+
+extern "C++" {
+
+template<class _Ty> inline
+ _Ty _Pow_int(_Ty _X, int _Y)
+ {unsigned int _N;
+ if (_Y >= 0)
+ _N = (unsigned int)_Y;
+ else
+ _N = (unsigned int)(-_Y);
+ for (_Ty _Z = _Ty(1); ; _X *= _X)
+ {if ((_N & 1) != 0)
+ _Z *= _X;
+ if ((_N >>= 1) == 0)
+ return (_Y < 0 ? _Ty(1) / _Z : _Z); }}
+
+inline long __cdecl abs( long _X)
+ {return (labs(_X)); }
+inline double __cdecl abs( double _X)
+ {return (fabs(_X)); }
+inline double __cdecl pow( double _X, int _Y)
+ {return (_Pow_int(_X, _Y)); }
+inline float __cdecl abs( float _X)
+ {return (fabsf(_X)); }
+inline float __cdecl acos( float _X)
+ {return (acosf(_X)); }
+inline float __cdecl asin( float _X)
+ {return (asinf(_X)); }
+inline float __cdecl atan( float _X)
+ {return (atanf(_X)); }
+inline float __cdecl atan2( float _Y, float _X)
+ {return (atan2f(_Y, _X)); }
+inline float __cdecl ceil( float _X)
+ {return (ceilf(_X)); }
+inline float __cdecl cos( float _X)
+ {return (cosf(_X)); }
+inline float __cdecl cosh( float _X)
+ {return (coshf(_X)); }
+inline float __cdecl exp( float _X)
+ {return (expf(_X)); }
+inline float __cdecl fabs( float _X)
+ {return (fabsf(_X)); }
+inline float __cdecl floor( float _X)
+ {return (floorf(_X)); }
+inline float __cdecl fmod( float _X, float _Y)
+ {return (fmodf(_X, _Y)); }
+inline float __cdecl frexp( float _X, int * _Y)
+ {return (frexpf(_X, _Y)); }
+inline float __cdecl ldexp( float _X, int _Y)
+ {return (ldexpf(_X, _Y)); }
+inline float __cdecl log( float _X)
+ {return (logf(_X)); }
+inline float __cdecl log10( float _X)
+ {return (log10f(_X)); }
+inline float __cdecl modf( float _X, float * _Y)
+ {return (modff(_X, _Y)); }
+inline float __cdecl pow( float _X, float _Y)
+ {return (powf(_X, _Y)); }
+inline float __cdecl pow( float _X, int _Y)
+ {return (_Pow_int(_X, _Y)); }
+inline float __cdecl sin( float _X)
+ {return (sinf(_X)); }
+inline float __cdecl sinh( float _X)
+ {return (sinhf(_X)); }
+inline float __cdecl sqrt( float _X)
+ {return (sqrtf(_X)); }
+inline float __cdecl tan( float _X)
+ {return (tanf(_X)); }
+inline float __cdecl tanh( float _X)
+ {return (tanhf(_X)); }
+inline long double __cdecl abs( long double _X)
+ {return (fabsl(_X)); }
+inline long double __cdecl acos( long double _X)
+ {return (acosl(_X)); }
+inline long double __cdecl asin( long double _X)
+ {return (asinl(_X)); }
+inline long double __cdecl atan( long double _X)
+ {return (atanl(_X)); }
+inline long double __cdecl atan2( long double _Y, long double _X)
+ {return (atan2l(_Y, _X)); }
+inline long double __cdecl ceil( long double _X)
+ {return (ceill(_X)); }
+inline long double __cdecl cos( long double _X)
+ {return (cosl(_X)); }
+inline long double __cdecl cosh( long double _X)
+ {return (coshl(_X)); }
+inline long double __cdecl exp( long double _X)
+ {return (expl(_X)); }
+inline long double __cdecl fabs( long double _X)
+ {return (fabsl(_X)); }
+inline long double __cdecl floor( long double _X)
+ {return (floorl(_X)); }
+inline long double __cdecl fmod( long double _X, long double _Y)
+ {return (fmodl(_X, _Y)); }
+inline long double __cdecl frexp( long double _X, int * _Y)
+ {return (frexpl(_X, _Y)); }
+inline long double __cdecl ldexp( long double _X, int _Y)
+ {return (ldexpl(_X, _Y)); }
+inline long double __cdecl log( long double _X)
+ {return (logl(_X)); }
+inline long double __cdecl log10( long double _X)
+ {return (log10l(_X)); }
+inline long double __cdecl modf( long double _X, long double * _Y)
+ {return (modfl(_X, _Y)); }
+inline long double __cdecl pow( long double _X, long double _Y)
+ {return (powl(_X, _Y)); }
+inline long double __cdecl pow( long double _X, int _Y)
+ {return (_Pow_int(_X, _Y)); }
+inline long double __cdecl sin( long double _X)
+ {return (sinl(_X)); }
+inline long double __cdecl sinh( long double _X)
+ {return (sinhl(_X)); }
+inline long double __cdecl sqrt( long double _X)
+ {return (sqrtl(_X)); }
+inline long double __cdecl tan( long double _X)
+ {return (tanl(_X)); }
+inline long double __cdecl tanh( long double _X)
+ {return (tanhl(_X)); }
+
+}
+
+
+
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace std {
+using ::acosf; using ::asinf;
+using ::atanf; using ::atan2f; using ::ceilf;
+using ::cosf; using ::coshf; using ::expf;
+using ::fabsf; using ::floorf; using ::fmodf;
+using ::frexpf; using ::ldexpf; using ::logf;
+using ::log10f; using ::modff; using ::powf;
+using ::sinf; using ::sinhf; using ::sqrtf;
+using ::tanf; using ::tanhf;
+
+using ::acosl; using ::asinl;
+using ::atanl; using ::atan2l; using ::ceill;
+using ::cosl; using ::coshl; using ::expl;
+using ::fabsl; using ::floorl; using ::fmodl;
+using ::frexpl; using ::ldexpl; using ::logl;
+using ::log10l; using ::modfl; using ::powl;
+using ::sinl; using ::sinhl; using ::sqrtl;
+using ::tanl; using ::tanhl;
+
+using ::abs;
+using ::acos; using ::asin;
+using ::atan; using ::atan2; using ::ceil;
+using ::cos; using ::cosh; using ::exp;
+using ::fabs; using ::floor; using ::fmod;
+using ::frexp; using ::ldexp; using ::log;
+using ::log10; using ::modf; using ::pow;
+using ::sin; using ::sinh; using ::sqrt;
+using ::tan; using ::tanh;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma pack(push,8)
+#pragma warning(push,3)
+
+
+namespace std {
+
+
+
+
+
+
+
+
+
+
+typedef enum
+ {
+ denorm_indeterminate = -1,
+ denorm_absent = 0,
+ denorm_present = 1}
+ float_denorm_style;
+
+
+typedef enum
+ {
+ round_indeterminate = -1,
+ round_toward_zero = 0,
+ round_to_nearest = 1,
+ round_toward_infinity = 2,
+ round_toward_neg_infinity = 3}
+ float_round_style;
+
+
+struct _Num_base
+ {
+ static const float_denorm_style has_denorm = (float_denorm_style)(denorm_absent);
+ static const bool has_denorm_loss = (bool)(false);
+ static const bool has_infinity = (bool)(false);
+ static const bool has_quiet_NaN = (bool)(false);
+ static const bool has_signaling_NaN = (bool)(false);
+ static const bool is_bounded = (bool)(false);
+ static const bool is_exact = (bool)(false);
+ static const bool is_iec559 = (bool)(false);
+ static const bool is_integer = (bool)(false);
+ static const bool is_modulo = (bool)(false);
+ static const bool is_signed = (bool)(false);
+ static const bool is_specialized = (bool)(false);
+ static const bool tinyness_before = (bool)(false);
+ static const bool traps = (bool)(false);
+ static const float_round_style round_style = (float_round_style)(round_toward_zero);
+ static const int digits = (int)(0);
+ static const int digits10 = (int)(0);
+ static const int max_exponent = (int)(0);
+ static const int max_exponent10 = (int)(0);
+ static const int min_exponent = (int)(0);
+ static const int min_exponent10 = (int)(0);
+ static const int radix = (int)(0);
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class _Ty>
+ class numeric_limits
+ : public _Num_base
+ {
+public:
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (_Ty(0));
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (_Ty(0));
+ }
+ };
+
+
+struct _Num_int_base
+ : public _Num_base
+ {
+ static const bool is_bounded = (bool)(true);
+ static const bool is_exact = (bool)(true);
+ static const bool is_integer = (bool)(true);
+ static const bool is_modulo = (bool)(true);
+ static const bool is_specialized = (bool)(true);
+ static const int radix = (int)(2);
+ };
+
+
+
+
+
+
+
+
+
+struct _Num_float_base
+ : public _Num_base
+ {
+ static const float_denorm_style has_denorm = (float_denorm_style)(denorm_present);
+ static const bool has_denorm_loss = (bool)(true);
+ static const bool has_infinity = (bool)(true);
+ static const bool has_quiet_NaN = (bool)(true);
+ static const bool has_signaling_NaN = (bool)(true);
+ static const bool is_bounded = (bool)(true);
+ static const bool is_exact = (bool)(false);
+ static const bool is_iec559 = (bool)(true);
+ static const bool is_integer = (bool)(false);
+ static const bool is_modulo = (bool)(false);
+ static const bool is_signed = (bool)(true);
+ static const bool is_specialized = (bool)(true);
+ static const bool tinyness_before = (bool)(true);
+ static const bool traps = (bool)(true);
+ static const float_round_style round_style = (float_round_style)(round_to_nearest);
+ static const int radix = (int)(2);
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> class numeric_limits<char>
+ : public _Num_int_base
+ {
+public:
+ typedef char _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((-128));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (127);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)((-128) != 0);
+ static const int digits = (int)(8 - ((-128) != 0 ? 1 : 0));
+ static const int digits10 = (int)((8 - ((-128) != 0 ? 1 : 0)) * 301L / 1000);
+ };
+
+
+
+
+
+
+
+template<> class numeric_limits<wchar_t>
+ : public _Num_int_base
+ {
+public:
+ typedef wchar_t _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((_Ty)0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return ((_Ty)0xffff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(0 != 0);
+ static const int digits = (int)(8 * sizeof (wchar_t) - (0 != 0 ? 1 : 0));
+ static const int digits10 = (int)((8 * sizeof (wchar_t) - (0 != 0 ? 1 : 0)) * 301L / 1000);
+ };
+
+
+
+
+
+
+
+template<> class numeric_limits<_Bool>
+ : public _Num_int_base
+ {
+public:
+ typedef bool _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (false);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (true);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_modulo = (bool)(false);
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(1);
+ static const int digits10 = (int)(0);
+ };
+
+
+
+
+
+
+
+template<> class numeric_limits<signed char>
+ : public _Num_int_base
+ {
+public:
+ typedef signed char _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((-128));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (127);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(true);
+ static const int digits = (int)(8 - 1);
+ static const int digits10 = (int)((8 - 1) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<unsigned char>
+ : public _Num_int_base
+ {
+public:
+ typedef unsigned char _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0xff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(8);
+ static const int digits10 = (int)((8) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<short>
+ : public _Num_int_base
+ {
+public:
+ typedef short _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((-32768));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (32767);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(true);
+ static const int digits = (int)(8 * sizeof (short) - 1);
+ static const int digits10 = (int)((8 * sizeof (short) - 1) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<unsigned short>
+ : public _Num_int_base
+ {
+public:
+ typedef unsigned short _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0xffff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(8 * sizeof (unsigned short));
+ static const int digits10 = (int)((8 * sizeof (unsigned short)) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<int>
+ : public _Num_int_base
+ {
+public:
+ typedef int _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((-2147483647 - 1));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (2147483647);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(true);
+ static const int digits = (int)(8 * sizeof (int) - 1);
+ static const int digits10 = (int)((8 * sizeof (int) - 1) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<unsigned int>
+ : public _Num_int_base
+ {
+public:
+ typedef unsigned int _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0xffffffff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(8 * sizeof (unsigned int));
+ static const int digits10 = (int)((8 * sizeof (unsigned int)) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<long>
+ : public _Num_int_base
+ {
+public:
+ typedef long _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return ((-2147483647L - 1));
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (2147483647L);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(true);
+ static const int digits = (int)(8 * sizeof (long) - 1);
+ static const int digits10 = (int)((8 * sizeof (long) - 1) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<unsigned long>
+ : public _Num_int_base
+ {
+public:
+ typedef unsigned long _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0xffffffffUL);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(8 * sizeof (unsigned long));
+ static const int digits10 = (int)((8 * sizeof (unsigned long)) * 301L / 1000);
+ };
+
+
+
+
+
+
+
+template<> class numeric_limits<__int64>
+ : public _Num_int_base
+ {
+public:
+ typedef __int64 _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (-0x7fffffffffffffff - 1);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0x7fffffffffffffff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(true);
+ static const int digits = (int)(8 * sizeof (__int64) - 1);
+ static const int digits10 = (int)((8 * sizeof (__int64) - 1) * 301L / 1000);
+ };
+
+
+
+
+
+
+template<> class numeric_limits<unsigned __int64>
+ : public _Num_int_base
+ {
+public:
+ typedef unsigned __int64 _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (0xffffffffffffffff);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (0);
+ }
+
+ static const bool is_signed = (bool)(false);
+ static const int digits = (int)(8 * sizeof (unsigned __int64));
+ static const int digits10 = (int)((8 * sizeof (unsigned __int64)) * 301L / 1000);
+ };
+
+
+
+
+
+
+
+
+template<> class numeric_limits<float>
+ : public _Num_float_base
+ {
+public:
+ typedef float _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (1.175494351e-38F);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (3.402823466e+38F);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (1.192092896e-07F);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0.5);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (_FDenorm._Float);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (_FInf._Float);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (_FNan._Float);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (_FSnan._Float);
+ }
+
+ static const int digits = (int)(24);
+ static const int digits10 = (int)(6);
+ static const int max_exponent = (int)((int)128);
+ static const int max_exponent10 = (int)((int)38);
+ static const int min_exponent = (int)((int)(-125));
+ static const int min_exponent10 = (int)((int)(-37));
+ };
+
+
+
+
+
+
+
+
+
+template<> class numeric_limits<double>
+ : public _Num_float_base
+ {
+public:
+ typedef double _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (2.2250738585072014e-308);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (1.7976931348623158e+308);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (2.2204460492503131e-016);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0.5);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (_Denorm._Double);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (_Inf._Double);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (_Nan._Double);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (_Snan._Double);
+ }
+
+ static const int digits = (int)(53);
+ static const int digits10 = (int)(15);
+ static const int max_exponent = (int)((int)1024);
+ static const int max_exponent10 = (int)((int)308);
+ static const int min_exponent = (int)((int)(-1021));
+ static const int min_exponent10 = (int)((int)(-307));
+ };
+
+
+
+
+
+
+
+
+
+template<> class numeric_limits<long double>
+ : public _Num_float_base
+ {
+public:
+ typedef long double _Ty;
+
+ static _Ty (__cdecl min)() throw ()
+ {
+ return (2.2250738585072014e-308);
+ }
+
+ static _Ty (__cdecl max)() throw ()
+ {
+ return (1.7976931348623158e+308);
+ }
+
+ static _Ty __cdecl epsilon() throw ()
+ {
+ return (2.2204460492503131e-016);
+ }
+
+ static _Ty __cdecl round_error() throw ()
+ {
+ return (0.5);
+ }
+
+ static _Ty __cdecl denorm_min() throw ()
+ {
+ return (_LDenorm._Long_double);
+ }
+
+ static _Ty __cdecl infinity() throw ()
+ {
+ return (_LInf._Long_double);
+ }
+
+ static _Ty __cdecl quiet_NaN() throw ()
+ {
+ return (_LNan._Long_double);
+ }
+
+ static _Ty __cdecl signaling_NaN() throw ()
+ {
+ return (_LSnan._Long_double);
+ }
+
+ static const int digits = (int)(53);
+ static const int digits10 = (int)(15);
+ static const int max_exponent = (int)((int)1024);
+ static const int max_exponent10 = (int)((int)308);
+ static const int min_exponent = (int)((int)(-1021));
+ static const int min_exponent10 = (int)((int)(-307));
+ };
+
+
+
+
+
+
+
+
+}
+
+
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef signed char int8_t;
+ typedef signed char int_least8_t;
+ typedef signed char int_fast8_t;
+ typedef unsigned char uint8_t;
+ typedef unsigned char uint_least8_t;
+ typedef unsigned char uint_fast8_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef short int16_t;
+ typedef short int_least16_t;
+ typedef short int_fast16_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned short uint_least16_t;
+ typedef unsigned short uint_fast16_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef int int32_t;
+ typedef int int_least32_t;
+ typedef int int_fast32_t;
+ typedef unsigned int uint32_t;
+ typedef unsigned int uint_least32_t;
+ typedef unsigned int uint_fast32_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef __int64 intmax_t;
+ typedef unsigned __int64 uintmax_t;
+ typedef __int64 int64_t;
+ typedef __int64 int_least64_t;
+ typedef __int64 int_fast64_t;
+ typedef unsigned __int64 uint64_t;
+ typedef unsigned __int64 uint_least64_t;
+ typedef unsigned __int64 uint_fast64_t;
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+
+
+
+
+
+
+ typedef boost::uintmax_t static_min_max_unsigned_type;
+ typedef boost::intmax_t static_min_max_signed_type;
+ typedef boost::uintmax_t static_log2_argument_type;
+ typedef int static_log2_result_type;
+
+
+
+
+
+
+
+
+
+template < class T >
+ class integer_traits;
+
+template < >
+ class integer_traits< bool >;
+
+template < >
+ class integer_traits< char >;
+
+template < >
+ class integer_traits< signed char >;
+
+template < >
+ class integer_traits< unsigned char >;
+
+
+template < >
+ class integer_traits< wchar_t >;
+
+
+template < >
+ class integer_traits< short >;
+
+template < >
+ class integer_traits< unsigned short >;
+
+template < >
+ class integer_traits< int >;
+
+template < >
+ class integer_traits< unsigned int >;
+
+template < >
+ class integer_traits< long >;
+
+template < >
+ class integer_traits< unsigned long >;
+
+
+template < >
+class integer_traits< ::boost::long_long_type>;
+
+template < >
+class integer_traits< ::boost::ulong_long_type >;
+
+
+
+
+
+
+
+
+
+
+
+template < typename LeastInt >
+ struct int_fast_t;
+
+template< int Bits >
+ struct int_t;
+
+template< int Bits >
+ struct uint_t;
+
+
+ template< boost::long_long_type MaxValue >
+
+
+
+ struct int_max_value_t;
+
+
+ template< boost::long_long_type MinValue >
+
+
+
+ struct int_min_value_t;
+
+
+ template< boost::ulong_long_type MaxValue >
+
+
+
+ struct uint_value_t;
+
+
+
+
+template < std::size_t Bit >
+ struct high_bit_mask_t;
+
+template < std::size_t Bits >
+ struct low_bits_mask_t;
+
+template < >
+ struct low_bits_mask_t< ::std::numeric_limits<unsigned char>::digits >;
+
+
+
+template <static_log2_argument_type Value >
+ struct static_log2;
+
+template <> struct static_log2<0u>;
+
+
+
+
+template <static_min_max_signed_type Value1, static_min_max_signed_type Value2>
+ struct static_signed_min;
+
+template <static_min_max_signed_type Value1, static_min_max_signed_type Value2>
+ struct static_signed_max;
+
+template <static_min_max_unsigned_type Value1, static_min_max_unsigned_type Value2>
+ struct static_unsigned_min;
+
+template <static_min_max_unsigned_type Value1, static_min_max_unsigned_type Value2>
+ struct static_unsigned_max;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+template<class T>
+class integer_traits : public std::numeric_limits<T>
+{
+public:
+ static const bool is_integral = false;
+};
+
+namespace detail {
+template<class T, T min_val, T max_val>
+class integer_traits_base
+{
+public:
+ static const bool is_integral = true;
+ static const T const_min = min_val;
+ static const T const_max = max_val;
+};
+
+
+
+template<class T, T min_val, T max_val>
+const bool integer_traits_base<T, min_val, max_val>::is_integral;
+
+template<class T, T min_val, T max_val>
+const T integer_traits_base<T, min_val, max_val>::const_min;
+
+template<class T, T min_val, T max_val>
+const T integer_traits_base<T, min_val, max_val>::const_max;
+
+
+}
+
+template<>
+class integer_traits<bool>
+ : public std::numeric_limits<bool>,
+ public detail::integer_traits_base<bool, false, true>
+{ };
+
+template<>
+class integer_traits<char>
+ : public std::numeric_limits<char>,
+ public detail::integer_traits_base<char, (-128), 127>
+{ };
+
+template<>
+class integer_traits<signed char>
+ : public std::numeric_limits<signed char>,
+ public detail::integer_traits_base<signed char, (-128), 127>
+{ };
+
+template<>
+class integer_traits<unsigned char>
+ : public std::numeric_limits<unsigned char>,
+ public detail::integer_traits_base<unsigned char, 0, 0xff>
+{ };
+
+
+template<>
+class integer_traits<wchar_t>
+ : public std::numeric_limits<wchar_t>,
+
+
+
+ public detail::integer_traits_base<wchar_t, 0, 0xffff>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ };
+
+
+template<>
+class integer_traits<short>
+ : public std::numeric_limits<short>,
+ public detail::integer_traits_base<short, (-32768), 32767>
+{ };
+
+template<>
+class integer_traits<unsigned short>
+ : public std::numeric_limits<unsigned short>,
+ public detail::integer_traits_base<unsigned short, 0, 0xffff>
+{ };
+
+template<>
+class integer_traits<int>
+ : public std::numeric_limits<int>,
+ public detail::integer_traits_base<int, (-2147483647 - 1), 2147483647>
+{ };
+
+template<>
+class integer_traits<unsigned int>
+ : public std::numeric_limits<unsigned int>,
+ public detail::integer_traits_base<unsigned int, 0, 0xffffffff>
+{ };
+
+template<>
+class integer_traits<long>
+ : public std::numeric_limits<long>,
+ public detail::integer_traits_base<long, (-2147483647L - 1), 2147483647L>
+{ };
+
+template<>
+class integer_traits<unsigned long>
+ : public std::numeric_limits<unsigned long>,
+ public detail::integer_traits_base<unsigned long, 0, 0xffffffffUL>
+{ };
+
+
+
+
+template<>
+class integer_traits< ::boost::long_long_type>
+ : public std::numeric_limits< ::boost::long_long_type>,
+ public detail::integer_traits_base< ::boost::long_long_type, (-9223372036854775807i64 - 1), 9223372036854775807i64>
+{ };
+
+template<>
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, 0xffffffffffffffffui64>
+{ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+
+
+
+
+ template< typename LeastInt >
+ struct int_fast_t
+ {
+ typedef LeastInt fast;
+ typedef fast type;
+ };
+
+ namespace detail{
+
+
+ template< int Category > struct int_least_helper {};
+
+
+
+
+
+ template<> struct int_least_helper<1> { typedef boost::long_long_type least; };
+
+
+
+ template<> struct int_least_helper<2> { typedef long least; };
+ template<> struct int_least_helper<3> { typedef int least; };
+ template<> struct int_least_helper<4> { typedef short least; };
+ template<> struct int_least_helper<5> { typedef signed char least; };
+
+ template<> struct int_least_helper<6> { typedef boost::ulong_long_type least; };
+
+
+
+ template<> struct int_least_helper<7> { typedef unsigned long least; };
+ template<> struct int_least_helper<8> { typedef unsigned int least; };
+ template<> struct int_least_helper<9> { typedef unsigned short least; };
+ template<> struct int_least_helper<10> { typedef unsigned char least; };
+
+ template <int Bits>
+ struct exact_signed_base_helper{};
+ template <int Bits>
+ struct exact_unsigned_base_helper{};
+
+ template <> struct exact_signed_base_helper<sizeof(signed char)* 8> { typedef signed char exact; };
+ template <> struct exact_unsigned_base_helper<sizeof(unsigned char)* 8> { typedef unsigned char exact; };
+
+ template <> struct exact_signed_base_helper<sizeof(short)* 8> { typedef short exact; };
+ template <> struct exact_unsigned_base_helper<sizeof(unsigned short)* 8> { typedef unsigned short exact; };
+
+
+ template <> struct exact_signed_base_helper<sizeof(int)* 8> { typedef int exact; };
+ template <> struct exact_unsigned_base_helper<sizeof(unsigned int)* 8> { typedef unsigned int exact; };
+
+
+
+
+
+
+ template <> struct exact_signed_base_helper<sizeof(boost::long_long_type)* 8> { typedef boost::long_long_type exact; };
+ template <> struct exact_unsigned_base_helper<sizeof(boost::ulong_long_type)* 8> { typedef boost::ulong_long_type exact; };
+
+
+
+ }
+
+
+
+
+ template< int Bits >
+ struct int_t : public detail::exact_signed_base_helper<Bits>
+ {
+ typedef typename detail::int_least_helper
+ <
+
+ (Bits-1 <= (int)(sizeof(boost::long_long_type) * 8)) +
+
+
+
+ (Bits-1 <= ::std::numeric_limits<long>::digits) +
+ (Bits-1 <= ::std::numeric_limits<int>::digits) +
+ (Bits-1 <= ::std::numeric_limits<short>::digits) +
+ (Bits-1 <= ::std::numeric_limits<signed char>::digits)
+ >::least least;
+ typedef typename int_fast_t<least>::type fast;
+ };
+
+
+ template< int Bits >
+ struct uint_t : public detail::exact_unsigned_base_helper<Bits>
+ {
+
+
+
+
+
+
+
+
+
+
+ typedef typename detail::int_least_helper
+ <
+ 5 +
+
+ (Bits-1 <= (int)(sizeof(boost::long_long_type) * 8)) +
+
+
+
+ (Bits <= ::std::numeric_limits<unsigned long>::digits) +
+ (Bits <= ::std::numeric_limits<unsigned int>::digits) +
+ (Bits <= ::std::numeric_limits<unsigned short>::digits) +
+ (Bits <= ::std::numeric_limits<unsigned char>::digits)
+ >::least least;
+
+ typedef typename int_fast_t<least>::type fast;
+
+ };
+
+
+
+
+
+ template< boost::long_long_type MaxValue >
+
+
+
+ struct int_max_value_t
+ {
+ typedef typename detail::int_least_helper
+ <
+
+ (MaxValue <= ::boost::integer_traits<boost::long_long_type>::const_max) +
+
+
+
+ (MaxValue <= ::boost::integer_traits<long>::const_max) +
+ (MaxValue <= ::boost::integer_traits<int>::const_max) +
+ (MaxValue <= ::boost::integer_traits<short>::const_max) +
+ (MaxValue <= ::boost::integer_traits<signed char>::const_max)
+ >::least least;
+ typedef typename int_fast_t<least>::type fast;
+ };
+
+
+ template< boost::long_long_type MinValue >
+
+
+
+ struct int_min_value_t
+ {
+ typedef typename detail::int_least_helper
+ <
+
+ (MinValue >= ::boost::integer_traits<boost::long_long_type>::const_min) +
+
+
+
+ (MinValue >= ::boost::integer_traits<long>::const_min) +
+ (MinValue >= ::boost::integer_traits<int>::const_min) +
+ (MinValue >= ::boost::integer_traits<short>::const_min) +
+ (MinValue >= ::boost::integer_traits<signed char>::const_min)
+ >::least least;
+ typedef typename int_fast_t<least>::type fast;
+ };
+
+
+
+ template< boost::ulong_long_type MaxValue >
+
+
+
+ struct uint_value_t
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef typename detail::int_least_helper
+ <
+ 5 +
+
+ (MaxValue <= ::boost::integer_traits<boost::ulong_long_type>::const_max) +
+
+
+
+ (MaxValue <= ::boost::integer_traits<unsigned long>::const_max) +
+ (MaxValue <= ::boost::integer_traits<unsigned int>::const_max) +
+ (MaxValue <= ::boost::integer_traits<unsigned short>::const_max) +
+ (MaxValue <= ::boost::integer_traits<unsigned char>::const_max)
+ >::least least;
+
+ typedef typename int_fast_t<least>::type fast;
+ };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< int N > struct int_;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+struct integral_c_tag { static const int value = 0; };
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< int N >
+struct int_
+{
+ static const int value = N;
+
+
+
+
+
+ typedef int_ type;
+
+ typedef int value_type;
+ typedef integral_c_tag tag;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef boost::mpl::int_< static_cast<int>((value + 1)) > next;
+ typedef boost::mpl::int_< static_cast<int>((value - 1)) > prior;
+
+
+
+
+
+
+ operator int() const { return static_cast<int>(this->value); }
+};
+
+
+template< int N >
+int const boost::mpl::int_< N >::value;
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename F > struct template_arity;
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< bool C_ > struct bool_;
+
+
+typedef bool_<true> true_;
+typedef bool_<false> false_;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< bool C_ > struct bool_
+{
+ static const bool value = C_;
+ typedef integral_c_tag tag;
+ typedef bool_ type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+
+
+template< bool C_ >
+bool const bool_<C_>::value;
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+template< typename T, T N > struct integral_c;
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+
+
+
+
+
+ typedef integral_c type;
+
+ typedef T value_type;
+ typedef integral_c_tag tag;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+ typedef integral_c< T, static_cast<T>((value - 1)) > prior;
+
+
+
+
+
+
+ operator T() const { return static_cast<T>(this->value); }
+};
+
+
+template< typename T, T N >
+T const integral_c< T, N >::value;
+
+
+}}
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< bool C >
+struct integral_c<bool, C>
+{
+ static const bool value = C;
+ typedef integral_c_tag tag;
+ typedef integral_c type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+}}
+
+
+
+
+
+namespace boost{
+
+
+
+
+template <class T, T val>
+
+struct integral_constant : public mpl::integral_c<T, val>
+{
+ typedef integral_constant<T,val> type;
+};
+
+template<> struct integral_constant<bool,true> : public mpl::true_
+{
+
+
+
+
+
+
+
+ typedef integral_constant<bool,true> type;
+};
+template<> struct integral_constant<bool,false> : public mpl::false_
+{
+
+
+
+
+
+
+
+ typedef integral_constant<bool,false> type;
+};
+
+typedef integral_constant<bool,true> true_type;
+typedef integral_constant<bool,false> false_type;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+template< typename T, typename U > struct is_same : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_same< T,T > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace detail {
+
+
+
+
+
+
+
+template <typename T> struct cv_traits_imp {};
+
+template <typename T>
+struct cv_traits_imp<T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+
+template <typename T>
+struct cv_traits_imp<const T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+
+template <typename T>
+struct cv_traits_imp<volatile T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+
+template <typename T>
+struct cv_traits_imp<const volatile T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail{
+template <class T>
+struct is_volatile_rval_filter
+{
+
+
+
+ static const bool value = ::boost::detail::cv_traits_imp<T*>::is_volatile;
+
+};
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+template< typename T > struct is_volatile : public ::boost::integral_constant<bool,::boost::detail::is_volatile_rval_filter<T>::value> { public: };
+template< typename T > struct is_volatile< T& > : public ::boost::integral_constant<bool,false> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+template< typename T > struct is_void : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_void< void > : public ::boost::integral_constant<bool,true> { public: };
+
+
+template<> struct is_void< void const > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_void< void volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_void< void const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+template< typename T > struct is_integral : public ::boost::integral_constant<bool,false> { public: };
+
+template<> struct is_integral< unsigned char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+template<> struct is_integral< signed char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+template<> struct is_integral< bool > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+template<> struct is_integral< wchar_t > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct is_integral< ::boost::ulong_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::long_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+template< typename T > struct is_float : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_float< float > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< long double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
+struct ice_or;
+
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_or
+{
+ static const bool value = true;
+};
+
+template <>
+struct ice_or<false, false, false, false, false, false, false>
+{
+ static const bool value = false;
+};
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+namespace detail {
+
+template< typename T >
+struct is_arithmetic_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_float<T>::value >::value);
+};
+
+}
+
+
+
+
+
+
+template< typename T > struct is_arithmetic : public ::boost::integral_constant<bool,::boost::detail::is_arithmetic_impl<T>::value> { public: };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename T > struct is_enum : public ::boost::integral_constant<bool,__is_enum(T)> { public: };
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+template< typename T > struct is_lvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_lvalue_reference< T& > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+template< typename T > struct is_rvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+typedef char yes_type;
+struct no_type
+{
+ char padding[8];
+};
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
+struct ice_and;
+
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_and
+{
+ static const bool value = false;
+};
+
+template <>
+struct ice_and<true, true, true, true, true, true, true>
+{
+ static const bool value = true;
+};
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+template <bool b>
+struct ice_not
+{
+ static const bool value = true;
+};
+
+template <>
+struct ice_not<true>
+{
+ static const bool value = false;
+};
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+template <int b1, int b2>
+struct ice_eq
+{
+ static const bool value = (b1 == b2);
+};
+
+template <int b1, int b2>
+struct ice_ne
+{
+ static const bool value = (b1 != b2);
+};
+
+
+template <int b1, int b2> bool const ice_eq<b1,b2>::value;
+template <int b1, int b2> bool const ice_ne<b1,b2>::value;
+
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_reference_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value >::value);
+};
+
+}
+
+template< typename T > struct is_reference : public ::boost::integral_constant<bool,::boost::detail::is_reference_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+template< typename T > struct is_array : public ::boost::integral_constant<bool,false> { public: };
+
+template< typename T, std::size_t N > struct is_array< T[N] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, std::size_t N > struct is_array< T const[N] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, std::size_t N > struct is_array< T volatile[N] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, std::size_t N > struct is_array< T const volatile[N] > : public ::boost::integral_constant<bool,true> { public: };
+
+template< typename T > struct is_array< T[] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T > struct is_array< T const[] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T > struct is_array< T volatile[] > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T > struct is_array< T const volatile[] > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+
+struct false_result
+{
+ template <typename T> struct result_
+ {
+ static const bool value = false;
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+no_type __cdecl is_mem_fun_pointer_tester(...);
+
+
+
+
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const volatile);
+
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...));
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const volatile);
+
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...));
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( ...) const volatile);
+
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...));
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( ...) const volatile);
+
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)());
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...));
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) const);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) volatile);
+
+template <class R, class T >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( ...) const volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const volatile);
+
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const volatile);
+
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 ...) const volatile);
+
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 ...) const volatile);
+
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...));
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) const);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) volatile);
+
+template <class R, class T , class T0 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const volatile);
+
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...));
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) const);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) volatile);
+
+template <class R, class T , class T0 , class T1 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);
+
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);
+
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);
+
+
+
+
+
+
+
+
+
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace detail {
+
+
+
+template <bool>
+struct is_mem_fun_pointer_select
+ : public ::boost::type_traits::false_result
+{
+};
+
+template <>
+struct is_mem_fun_pointer_select<false>
+{
+ template <typename T> struct result_
+ {
+
+#pragma warning(push)
+#pragma warning(disable:6334)
+
+ static T* make_t;
+ typedef result_<T> self_type;
+
+ static const bool value = ( 1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(self_type::make_t)) );
+
+#pragma warning(pop)
+
+ };
+};
+
+template <typename T>
+struct is_member_function_pointer_impl
+ : public is_mem_fun_pointer_select<
+ ::boost::type_traits::ice_or<
+ ::boost::is_reference<T>::value
+ , ::boost::is_array<T>::value
+ >::value
+ >::template result_<T>
+{
+};
+
+
+template <typename T>
+struct is_member_function_pointer_impl<T&> : public false_type{};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct is_member_function_pointer_impl< void > { public: static const bool value = (false); };
+
+template<> struct is_member_function_pointer_impl< void const > { public: static const bool value = (false); };
+template<> struct is_member_function_pointer_impl< void volatile > { public: static const bool value = (false); };
+template<> struct is_member_function_pointer_impl< void const volatile > { public: static const bool value = (false); };
+
+
+}
+
+template< typename T > struct is_member_function_pointer : public ::boost::integral_constant<bool,::boost::detail::is_member_function_pointer_impl<T>::value> { public: };
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+
+template< typename T > struct is_member_pointer : public ::boost::integral_constant<bool,::boost::is_member_function_pointer<T>::value> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::* > : public ::boost::integral_constant<bool,true> { public: };
+
+
+template< typename T, typename U > struct is_member_pointer< U T::*const > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*volatile > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const volatile > : public ::boost::integral_constant<bool,true> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+namespace detail{
+
+template <class T>
+struct rvalue_ref_filter_rem_cv
+{
+ typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+template< typename T > struct remove_cv { public: typedef typename boost::detail::rvalue_ref_filter_rem_cv<T>::type type; };
+template< typename T > struct remove_cv<T&> { public: typedef T& type; };
+
+template< typename T, std::size_t N > struct remove_cv<T const[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T volatile[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T const volatile[N]> { public: typedef T type[N]; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+namespace detail {
+
+template< typename T > struct is_pointer_helper
+{
+ static const bool value = false;
+};
+
+
+
+
+
+
+
+
+template< typename T > struct is_pointer_helper<T*> { static const bool value = true; };
+
+
+
+template< typename T >
+struct is_pointer_impl
+{
+
+
+
+
+
+
+
+
+
+
+ static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value);
+
+};
+
+}
+
+template< typename T > struct is_pointer : public ::boost::integral_constant<bool,::boost::detail::is_pointer_impl<T>::value> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_scalar_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_arithmetic<T>::value, ::boost::is_enum<T>::value, ::boost::is_pointer<T>::value, ::boost::is_member_pointer<T>::value >::value);
+};
+
+
+
+template <> struct is_scalar_impl<void>{ static const bool value = false; };
+
+template <> struct is_scalar_impl<void const>{ static const bool value = false; };
+template <> struct is_scalar_impl<void volatile>{ static const bool value = false; };
+template <> struct is_scalar_impl<void const volatile>{ static const bool value = false; };
+
+
+}
+
+template< typename T > struct is_scalar : public ::boost::integral_constant<bool,::boost::detail::is_scalar_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+template< typename T > struct is_POD;
+
+namespace detail {
+
+
+
+template <typename T> struct is_pod_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_scalar<T>::value, ::boost::is_void<T>::value, (__is_pod(T) && __has_trivial_constructor(T)) >::value);
+};
+
+
+template <typename T, std::size_t sz>
+struct is_pod_impl<T[sz]>
+ : public is_pod_impl<T>
+{
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct is_pod_impl< void > { public: static const bool value = (true); };
+
+
+template<> struct is_pod_impl< void const > { public: static const bool value = (true); };
+template<> struct is_pod_impl< void volatile > { public: static const bool value = (true); };
+template<> struct is_pod_impl< void const volatile > { public: static const bool value = (true); };
+
+
+}
+
+template< typename T > struct is_POD : public ::boost::integral_constant<bool,::boost::detail::is_pod_impl<T>::value> { public: };
+template< typename T > struct is_pod : public ::boost::integral_constant<bool,::boost::detail::is_pod_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_copy_impl
+{
+
+ static const bool value = (__has_trivial_copy(T)|| ( ::boost::is_pod<T>::value && !::boost::is_volatile<T>::value));
+
+
+
+
+
+
+
+};
+
+}
+
+template< typename T > struct has_trivial_copy : public ::boost::integral_constant<bool,::boost::detail::has_trivial_copy_impl<T>::value> { public: };
+template< typename T > struct has_trivial_copy_constructor : public ::boost::integral_constant<bool,::boost::detail::has_trivial_copy_impl<T>::value> { public: };
+
+template<> struct has_trivial_copy< void > : public ::boost::integral_constant<bool,false> { public: };
+
+template<> struct has_trivial_copy< void const > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_copy< void const volatile > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_copy< void volatile > : public ::boost::integral_constant<bool,false> { public: };
+
+
+template<> struct has_trivial_copy_constructor< void > : public ::boost::integral_constant<bool,false> { public: };
+
+template<> struct has_trivial_copy_constructor< void const > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_copy_constructor< void const volatile > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_copy_constructor< void volatile > : public ::boost::integral_constant<bool,false> { public: };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_dtor_impl
+{
+
+ static const bool value = (__has_trivial_destructor(T) || ::boost::is_pod<T>::value);
+
+
+
+};
+
+}
+
+template< typename T > struct has_trivial_destructor : public ::boost::integral_constant<bool,::boost::detail::has_trivial_dtor_impl<T>::value> { public: };
+
+template<> struct has_trivial_destructor< void > : public ::boost::integral_constant<bool,false> { public: };
+
+template<> struct has_trivial_destructor< void const > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_destructor< void const volatile > : public ::boost::integral_constant<bool,false> { public: };
+template<> struct has_trivial_destructor< void volatile > : public ::boost::integral_constant<bool,false> { public: };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+namespace detail{
+
+
+
+
+template <class T>
+struct is_const_rvalue_filter
+{
+
+
+
+ static const bool value = ::boost::detail::cv_traits_imp<T*>::is_const;
+
+};
+
+
+
+
+
+
+
+}
+
+
+template< typename T > struct is_const : public ::boost::integral_constant<bool,::boost::detail::is_const_rvalue_filter<T>::value> { public: };
+template< typename T > struct is_const< T& > : public ::boost::integral_constant<bool,false> { public: };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T> struct is_union_impl
+{
+ typedef typename remove_cv<T>::type cvt;
+
+ static const bool value = __is_union(cvt);
+
+
+
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+template< typename T > struct is_union : public ::boost::integral_constant<bool,::boost::detail::is_union_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+namespace detail
+{
+
+template<class T> struct addr_impl_ref
+{
+ T & v_;
+
+ inline addr_impl_ref( T & v ): v_( v ) {}
+ inline operator T& () const { return v_; }
+
+private:
+ addr_impl_ref & operator=(const addr_impl_ref &);
+};
+
+template<class T> struct addressof_impl
+{
+ static inline T * f( T & v, long )
+ {
+ return reinterpret_cast<T*>(
+ &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
+ }
+
+ static inline T * f( T * v, int )
+ {
+ return v;
+ }
+};
+
+}
+
+template<class T> T * addressof( T & v )
+{
+
+
+
+
+
+
+ return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+template<class T> class reference_wrapper
+{
+public:
+ typedef T type;
+
+
+
+
+
+
+
+ explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
+
+
+
+ operator T& () const { return *t_; }
+
+ T& get() const { return *t_; }
+
+ T* get_pointer() const { return t_; }
+
+private:
+
+ T* t_;
+};
+
+
+
+
+
+
+
+template<class T> inline reference_wrapper<T> const ref(T & t)
+{
+ return reference_wrapper<T>(t);
+}
+
+template<class T> inline reference_wrapper<T const> const cref(T const & t)
+{
+ return reference_wrapper<T const>(t);
+}
+
+
+
+
+
+template<typename T>
+class is_reference_wrapper
+ : public mpl::false_
+{
+};
+
+template<typename T>
+class unwrap_reference
+{
+ public:
+ typedef T type;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<typename T> class is_reference_wrapper< reference_wrapper<T> > : public mpl::true_ { }; template<typename T> class unwrap_reference< reference_wrapper<T> > { public: typedef T type; };
+
+template<typename T> class is_reference_wrapper< reference_wrapper<T> const > : public mpl::true_ { }; template<typename T> class unwrap_reference< reference_wrapper<T> const > { public: typedef T type; };
+template<typename T> class is_reference_wrapper< reference_wrapper<T> volatile > : public mpl::true_ { }; template<typename T> class unwrap_reference< reference_wrapper<T> volatile > { public: typedef T type; };
+template<typename T> class is_reference_wrapper< reference_wrapper<T> const volatile > : public mpl::true_ { }; template<typename T> class unwrap_reference< reference_wrapper<T> const volatile > { public: typedef T type; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template <class T> inline typename unwrap_reference<T>::type&
+unwrap_ref(T& t)
+{
+ return t;
+}
+
+template<class T> inline T* get_pointer( reference_wrapper<T> const & r )
+{
+ return r.get_pointer();
+}
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct value_type_wknd
+{
+ typedef typename T::value_type type;
+};
+
+
+
+
+
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct void_;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+struct na
+{
+ typedef na type;
+ enum { value = 0 };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename T >
+struct is_na
+ : false_
+{
+
+
+
+};
+
+template<>
+struct is_na<na>
+ : true_
+{
+
+
+
+};
+
+template< typename T >
+struct is_not_na
+ : true_
+{
+
+
+
+};
+
+template<>
+struct is_not_na<na>
+ : false_
+{
+
+
+
+};
+
+
+template< typename T, typename U > struct if_na
+{
+ typedef T type;
+};
+
+template< typename U > struct if_na<na,U>
+{
+ typedef U type;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename T = na
+ , typename Tag = void_
+
+ >
+struct lambda;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template<
+ bool C
+ , typename T1
+ , typename T2
+ >
+struct if_c
+{
+ typedef T1 type;
+};
+
+template<
+ typename T1
+ , typename T2
+ >
+struct if_c<false,T1,T2>
+{
+ typedef T2 type;
+};
+
+
+
+template<
+ typename T1 = na
+ , typename T2 = na
+ , typename T3 = na
+ >
+struct if_
+{
+ private:
+
+ typedef if_c<
+
+
+
+ static_cast<bool>(T1::value)
+
+ , T2
+ , T3
+ > almost_type_;
+
+ public:
+ typedef typename almost_type_::type type;
+
+
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct if_< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : if_< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< if_< na , na , na > , Tag > { typedef false_ is_le; typedef if_< na , na , na > result_; typedef if_< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< std::size_t N > struct size_t;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< std::size_t N >
+struct size_t
+{
+ static const std::size_t value = N;
+
+
+
+
+
+ typedef size_t type;
+
+ typedef std::size_t value_type;
+ typedef integral_c_tag tag;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef boost::mpl::size_t< static_cast<std::size_t>((value + 1)) > next;
+ typedef boost::mpl::size_t< static_cast<std::size_t>((value - 1)) > prior;
+
+
+
+
+
+
+ operator std::size_t() const { return static_cast<std::size_t>(this->value); }
+};
+
+
+template< std::size_t N >
+std::size_t const boost::mpl::size_t< N >::value;
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable: 4121 4512)
+
+
+
+
+
+namespace boost {
+
+template <typename T> struct alignment_of;
+
+
+namespace detail {
+
+
+#pragma warning(push)
+#pragma warning(disable:4324)
+
+template <typename T>
+struct alignment_of_hack
+{
+ char c;
+ T t;
+ alignment_of_hack();
+};
+
+#pragma warning(pop)
+
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{
+ static const std::size_t value = A < S ? A : S;
+};
+
+
+template< typename T >
+struct alignment_of_impl
+{
+
+
+
+
+
+
+ static const std::size_t value = (::boost::detail::alignment_logic< sizeof(::boost::detail::alignment_of_hack<T>) - sizeof(T), __alignof(T) >::value);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+};
+
+}
+
+template< typename T > struct alignment_of : public ::boost::integral_constant<std::size_t,::boost::detail::alignment_of_impl<T>::value> { public: };
+
+
+
+
+template <typename T>
+struct alignment_of<T&>
+ : public alignment_of<T*>
+{
+};
+
+
+
+
+
+
+
+
+
+
+template<> struct alignment_of<void> : public ::boost::integral_constant<std::size_t,0> { public: };
+
+template<> struct alignment_of<void const> : public ::boost::integral_constant<std::size_t,0> { public: };
+template<> struct alignment_of<void volatile> : public ::boost::integral_constant<std::size_t,0> { public: };
+template<> struct alignment_of<void const volatile> : public ::boost::integral_constant<std::size_t,0> { public: };
+
+
+}
+
+
+
+
+
+#pragma warning(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+ template <bool B, class T = void>
+ struct enable_if_c {
+ typedef T type;
+ };
+
+ template <class T>
+ struct enable_if_c<false, T> {};
+
+ template <class Cond, class T = void>
+ struct enable_if : public enable_if_c<Cond::value, T> {};
+
+ template <bool B, class T>
+ struct lazy_enable_if_c {
+ typedef typename T::type type;
+ };
+
+ template <class T>
+ struct lazy_enable_if_c<false, T> {};
+
+ template <class Cond, class T>
+ struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+
+
+ template <bool B, class T = void>
+ struct disable_if_c {
+ typedef T type;
+ };
+
+ template <class T>
+ struct disable_if_c<true, T> {};
+
+ template <class Cond, class T = void>
+ struct disable_if : public disable_if_c<Cond::value, T> {};
+
+ template <bool B, class T>
+ struct lazy_disable_if_c {
+ typedef typename T::type type;
+ };
+
+ template <class T>
+ struct lazy_disable_if_c<true, T> {};
+
+ template <class Cond, class T>
+ struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+template<typename F, typename G>
+ bool function_equal_impl(const F& f, const G& g, long)
+ { return f == g; }
+
+
+
+
+template<typename F, typename G>
+ bool function_equal(const F& f, const G& g)
+ { return function_equal_impl(f, g, 0); }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ class bad_function_call;
+
+
+
+ template<typename Signature> class function;
+
+ template<typename Signature>
+ inline void swap(function<Signature>& f1, function<Signature>& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+
+ template<typename R> class function0;
+ template<typename R, typename T1> class function1;
+ template<typename R, typename T1, typename T2> class function2;
+ template<typename R, typename T1, typename T2, typename T3> class function3;
+ template<typename R, typename T1, typename T2, typename T3, typename T4>
+ class function4;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5>
+ class function5;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6>
+ class function6;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7>
+ class function7;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8>
+ class function8;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9>
+ class function9;
+ template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9,
+ typename T10>
+ class function10;
+}
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4793 )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ class X;
+
+
+
+
+
+
+
+ union function_buffer
+ {
+
+ mutable void* obj_ptr;
+
+
+ struct type_t {
+
+ const detail::sp_typeinfo* type;
+
+
+ bool const_qualified;
+
+ bool volatile_qualified;
+ } type;
+
+
+ mutable void (*func_ptr)();
+
+
+ struct bound_memfunc_ptr_t {
+ void (X::*memfunc_ptr)(int);
+ void* obj_ptr;
+ } bound_memfunc_ptr;
+
+
+
+ struct obj_ref_t {
+ mutable void* obj_ptr;
+ bool is_const_qualified;
+ bool is_volatile_qualified;
+ } obj_ref;
+
+
+ mutable char data;
+ };
+
+
+
+
+
+
+
+ struct unusable
+ {
+ unusable() {}
+ template<typename T> unusable(const T&) {}
+ };
+
+
+
+
+
+ template<typename T> struct function_return_type { typedef T type; };
+
+ template<>
+ struct function_return_type<void>
+ {
+ typedef unusable type;
+ };
+
+
+ enum functor_manager_operation_type {
+ clone_functor_tag,
+ move_functor_tag,
+ destroy_functor_tag,
+ check_functor_type_tag,
+ get_functor_type_tag
+ };
+
+
+ struct function_ptr_tag {};
+ struct function_obj_tag {};
+ struct member_ptr_tag {};
+ struct function_obj_ref_tag {};
+
+ template<typename F>
+ class get_function_tag
+ {
+ typedef typename mpl::if_c<(is_pointer<F>::value),
+ function_ptr_tag,
+ function_obj_tag>::type ptr_or_obj_tag;
+
+ typedef typename mpl::if_c<(is_member_pointer<F>::value),
+ member_ptr_tag,
+ ptr_or_obj_tag>::type ptr_or_obj_or_mem_tag;
+
+ typedef typename mpl::if_c<(is_reference_wrapper<F>::value),
+ function_obj_ref_tag,
+ ptr_or_obj_or_mem_tag>::type or_ref_tag;
+
+ public:
+ typedef or_ref_tag type;
+ };
+
+
+
+ template<typename F>
+ struct reference_manager
+ {
+ static inline void
+ manage(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op)
+ {
+ switch (op) {
+ case clone_functor_tag:
+ out_buffer.obj_ref = in_buffer.obj_ref;
+ return;
+
+ case move_functor_tag:
+ out_buffer.obj_ref = in_buffer.obj_ref;
+ in_buffer.obj_ref.obj_ptr = 0;
+ return;
+
+ case destroy_functor_tag:
+ out_buffer.obj_ref.obj_ptr = 0;
+ return;
+
+ case check_functor_type_tag:
+ {
+ const detail::sp_typeinfo& check_type
+ = *out_buffer.type.type;
+
+
+
+ if (((check_type)==(typeid(F)))
+ && (!in_buffer.obj_ref.is_const_qualified
+ || out_buffer.type.const_qualified)
+ && (!in_buffer.obj_ref.is_volatile_qualified
+ || out_buffer.type.volatile_qualified))
+ out_buffer.obj_ptr = in_buffer.obj_ref.obj_ptr;
+ else
+ out_buffer.obj_ptr = 0;
+ }
+ return;
+
+ case get_functor_type_tag:
+ out_buffer.type.type = &typeid(F);
+ out_buffer.type.const_qualified = in_buffer.obj_ref.is_const_qualified;
+ out_buffer.type.volatile_qualified = in_buffer.obj_ref.is_volatile_qualified;
+ return;
+ }
+ }
+ };
+
+
+
+
+
+ template<typename F>
+ struct function_allows_small_object_optimization
+ {
+ static const bool value = ((sizeof(F) <= sizeof(function_buffer) && (alignment_of<function_buffer>::value % alignment_of<F>::value == 0)));
+ };
+
+ template <typename F,typename A>
+ struct functor_wrapper: public F, public A
+ {
+ functor_wrapper( F f, A a ):
+ F(f),
+ A(a)
+ {
+ }
+
+ functor_wrapper(const functor_wrapper& f) :
+ F(static_cast<const F&>(f)),
+ A(static_cast<const A&>(f))
+ {
+ }
+ };
+
+
+
+
+
+ template<typename Functor>
+ struct functor_manager_common
+ {
+ typedef Functor functor_type;
+
+
+ static inline void
+ manage_ptr(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op)
+ {
+ if (op == clone_functor_tag)
+ out_buffer.func_ptr = in_buffer.func_ptr;
+ else if (op == move_functor_tag) {
+ out_buffer.func_ptr = in_buffer.func_ptr;
+ in_buffer.func_ptr = 0;
+ } else if (op == destroy_functor_tag)
+ out_buffer.func_ptr = 0;
+ else if (op == check_functor_type_tag) {
+ const detail::sp_typeinfo& check_type
+ = *out_buffer.type.type;
+ if (((check_type)==(typeid(Functor))))
+ out_buffer.obj_ptr = &in_buffer.func_ptr;
+ else
+ out_buffer.obj_ptr = 0;
+ } else {
+ out_buffer.type.type = &typeid(Functor);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ }
+ }
+
+
+ static inline void
+ manage_small(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op)
+ {
+ if (op == clone_functor_tag || op == move_functor_tag) {
+ const functor_type* in_functor =
+ reinterpret_cast<const functor_type*>(&in_buffer.data);
+ new (reinterpret_cast<void*>(&out_buffer.data)) functor_type(*in_functor);
+
+ if (op == move_functor_tag) {
+ functor_type* f = reinterpret_cast<functor_type*>(&in_buffer.data);
+ (void)f;
+ f->~Functor();
+ }
+ } else if (op == destroy_functor_tag) {
+
+ functor_type* f = reinterpret_cast<functor_type*>(&out_buffer.data);
+ (void)f;
+ f->~Functor();
+ } else if (op == check_functor_type_tag) {
+ const detail::sp_typeinfo& check_type
+ = *out_buffer.type.type;
+ if (((check_type)==(typeid(Functor))))
+ out_buffer.obj_ptr = &in_buffer.data;
+ else
+ out_buffer.obj_ptr = 0;
+ } else {
+ out_buffer.type.type = &typeid(Functor);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ }
+ }
+ };
+
+ template<typename Functor>
+ struct functor_manager
+ {
+ private:
+ typedef Functor functor_type;
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, function_ptr_tag)
+ {
+ functor_manager_common<Functor>::manage_ptr(in_buffer,out_buffer,op);
+ }
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, mpl::true_)
+ {
+ functor_manager_common<Functor>::manage_small(in_buffer,out_buffer,op);
+ }
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, mpl::false_)
+ {
+ if (op == clone_functor_tag) {
+
+
+
+
+
+ const functor_type* f =
+ static_cast<const functor_type*>(in_buffer.obj_ptr);
+ functor_type* new_f = new functor_type(*f);
+ out_buffer.obj_ptr = new_f;
+ } else if (op == move_functor_tag) {
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ in_buffer.obj_ptr = 0;
+ } else if (op == destroy_functor_tag) {
+
+ functor_type* f =
+ static_cast<functor_type*>(out_buffer.obj_ptr);
+ delete f;
+ out_buffer.obj_ptr = 0;
+ } else if (op == check_functor_type_tag) {
+ const detail::sp_typeinfo& check_type
+ = *out_buffer.type.type;
+ if (((check_type)==(typeid(Functor))))
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ else
+ out_buffer.obj_ptr = 0;
+ } else {
+ out_buffer.type.type = &typeid(Functor);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ }
+ }
+
+
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, function_obj_tag)
+ {
+ manager(in_buffer, out_buffer, op,
+ mpl::bool_<(function_allows_small_object_optimization<functor_type>::value)>());
+ }
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, member_ptr_tag)
+ {
+ manager(in_buffer, out_buffer, op, mpl::true_());
+ }
+
+ public:
+
+
+ static inline void
+ manage(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op)
+ {
+ typedef typename get_function_tag<functor_type>::type tag_type;
+ switch (op) {
+ case get_functor_type_tag:
+ out_buffer.type.type = &typeid(functor_type);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ return;
+
+ default:
+ manager(in_buffer, out_buffer, op, tag_type());
+ return;
+ }
+ }
+ };
+
+ template<typename Functor, typename Allocator>
+ struct functor_manager_a
+ {
+ private:
+ typedef Functor functor_type;
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, function_ptr_tag)
+ {
+ functor_manager_common<Functor>::manage_ptr(in_buffer,out_buffer,op);
+ }
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, mpl::true_)
+ {
+ functor_manager_common<Functor>::manage_small(in_buffer,out_buffer,op);
+ }
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, mpl::false_)
+ {
+ typedef functor_wrapper<Functor,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+
+ if (op == clone_functor_tag) {
+
+
+
+ const functor_wrapper_type* f =
+ static_cast<const functor_wrapper_type*>(in_buffer.obj_ptr);
+ wrapper_allocator_type wrapper_allocator(static_cast<Allocator const &>(*f));
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, *f);
+
+
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ out_buffer.obj_ptr = new_f;
+ } else if (op == move_functor_tag) {
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ in_buffer.obj_ptr = 0;
+ } else if (op == destroy_functor_tag) {
+
+ functor_wrapper_type* victim =
+ static_cast<functor_wrapper_type*>(in_buffer.obj_ptr);
+ wrapper_allocator_type wrapper_allocator(static_cast<Allocator const &>(*victim));
+ wrapper_allocator.destroy(victim);
+ wrapper_allocator.deallocate(victim,1);
+ out_buffer.obj_ptr = 0;
+ } else if (op == check_functor_type_tag) {
+ const detail::sp_typeinfo& check_type
+ = *out_buffer.type.type;
+ if (((check_type)==(typeid(Functor))))
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ else
+ out_buffer.obj_ptr = 0;
+ } else {
+ out_buffer.type.type = &typeid(Functor);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ }
+ }
+
+
+
+
+ static inline void
+ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op, function_obj_tag)
+ {
+ manager(in_buffer, out_buffer, op,
+ mpl::bool_<(function_allows_small_object_optimization<functor_type>::value)>());
+ }
+
+ public:
+
+
+ static inline void
+ manage(const function_buffer& in_buffer, function_buffer& out_buffer,
+ functor_manager_operation_type op)
+ {
+ typedef typename get_function_tag<functor_type>::type tag_type;
+ switch (op) {
+ case get_functor_type_tag:
+ out_buffer.type.type = &typeid(functor_type);
+ out_buffer.type.const_qualified = false;
+ out_buffer.type.volatile_qualified = false;
+ return;
+
+ default:
+ manager(in_buffer, out_buffer, op, tag_type());
+ return;
+ }
+ }
+ };
+
+
+ struct useless_clear_type {};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ struct vtable_base
+ {
+ void (*manager)(const function_buffer& in_buffer,
+ function_buffer& out_buffer,
+ functor_manager_operation_type op);
+ };
+ }
+ }
+
+
+
+
+
+
+
+class function_base
+{
+public:
+ function_base() : vtable(0) { }
+
+
+ bool empty() const { return !vtable; }
+
+
+
+ const detail::sp_typeinfo& target_type() const
+ {
+ if (!vtable) return typeid(void);
+
+ detail::function::function_buffer type;
+ get_vtable()->manager(functor, type, detail::function::get_functor_type_tag);
+ return *type.type.type;
+ }
+
+ template<typename Functor>
+ Functor* target()
+ {
+ if (!vtable) return 0;
+
+ detail::function::function_buffer type_result;
+ type_result.type.type = &typeid(Functor);
+ type_result.type.const_qualified = is_const<Functor>::value;
+ type_result.type.volatile_qualified = is_volatile<Functor>::value;
+ get_vtable()->manager(functor, type_result,
+ detail::function::check_functor_type_tag);
+ return static_cast<Functor*>(type_result.obj_ptr);
+ }
+
+ template<typename Functor>
+
+
+
+ const Functor* target() const
+
+ {
+ if (!vtable) return 0;
+
+ detail::function::function_buffer type_result;
+ type_result.type.type = &typeid(Functor);
+ type_result.type.const_qualified = true;
+ type_result.type.volatile_qualified = is_volatile<Functor>::value;
+ get_vtable()->manager(functor, type_result,
+ detail::function::check_functor_type_tag);
+
+
+ return static_cast<const Functor*>(type_result.obj_ptr);
+ }
+
+ template<typename F>
+ bool contains(const F& f) const
+ {
+
+
+
+ if (const F* fp = this->template target<F>())
+
+ {
+ return function_equal(*fp, f);
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+public:
+ detail::function::vtable_base* get_vtable() const {
+ return reinterpret_cast<detail::function::vtable_base*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<std::size_t>(0x01));
+ }
+
+ bool has_trivial_copy_and_destroy() const {
+ return reinterpret_cast<std::size_t>(vtable) & 0x01;
+ }
+
+ detail::function::vtable_base* vtable;
+ mutable detail::function::function_buffer functor;
+};
+
+
+
+
+
+class bad_function_call : public std::runtime_error
+{
+public:
+ bad_function_call() : std::runtime_error("call to empty boost::function") {}
+};
+
+
+inline bool operator==(const function_base& f,
+ detail::function::useless_clear_type*)
+{
+ return f.empty();
+}
+
+inline bool operator!=(const function_base& f,
+ detail::function::useless_clear_type*)
+{
+ return !f.empty();
+}
+
+inline bool operator==(detail::function::useless_clear_type*,
+ const function_base& f)
+{
+ return f.empty();
+}
+
+inline bool operator!=(detail::function::useless_clear_type*,
+ const function_base& f)
+{
+ return !f.empty();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator==(const function_base& f, Functor g)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return function_equal(*fp, g);
+ else return false;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator==(Functor g, const function_base& f)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return function_equal(g, *fp);
+ else return false;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator!=(const function_base& f, Functor g)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return !function_equal(*fp, g);
+ else return true;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator!=(Functor g, const function_base& f)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return !function_equal(g, *fp);
+ else return true;
+ }
+
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator==(const function_base& f, reference_wrapper<Functor> g)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return fp == g.get_pointer();
+ else return false;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator==(reference_wrapper<Functor> g, const function_base& f)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return g.get_pointer() == fp;
+ else return false;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator!=(const function_base& f, reference_wrapper<Functor> g)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return fp != g.get_pointer();
+ else return true;
+ }
+
+template<typename Functor>
+ typename ::boost::enable_if_c<(::boost::type_traits::ice_not< (::boost::is_integral<Functor>::value)>::value), bool>::type
+ operator!=(reference_wrapper<Functor> g, const function_base& f)
+ {
+ if (const Functor* fp = f.template target<Functor>())
+ return g.get_pointer() != fp;
+ else return true;
+ }
+
+
+
+namespace detail {
+ namespace function {
+ inline bool has_empty_target(const function_base* f)
+ {
+ return f->empty();
+ }
+
+
+
+
+
+
+
+ inline bool has_empty_target(...)
+ {
+ return false;
+ }
+
+ }
+}
+}
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+template<class T> T * get_pointer(T * p)
+{
+ return p;
+}
+
+
+
+template<class T> T * get_pointer(std::auto_ptr<T> const& p)
+{
+ return p.get();
+}
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace _mfi
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class R, class T > class mf0
+{
+public:
+
+ typedef R result_type;
+ typedef T * argument_type;
+
+private:
+
+ typedef R ( T::*F) ();
+ F f_;
+
+ template<class U> R call(U & u, T const *) const
+ {
+ return (u.*f_)();
+ }
+
+ template<class U> R call(U & u, void const *) const
+ {
+ return (get_pointer(u)->*f_)();
+ }
+
+public:
+
+ explicit mf0(F f): f_(f) {}
+
+ R operator()(T * p) const
+ {
+ return (p->*f_)();
+ }
+
+ template<class U> R operator()(U & u) const
+ {
+ U const * p = 0;
+ return call(u, p);
+ }
+
+
+
+ template<class U> R operator()(U const & u) const
+ {
+ U const * p = 0;
+ return call(u, p);
+ }
+
+
+
+ R operator()(T & t) const
+ {
+ return (t.*f_)();
+ }
+
+ bool operator==(mf0 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf0 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T > class cmf0
+{
+public:
+
+ typedef R result_type;
+ typedef T const * argument_type;
+
+private:
+
+ typedef R ( T::*F) () const;
+ F f_;
+
+ template<class U> R call(U & u, T const *) const
+ {
+ return (u.*f_)();
+ }
+
+ template<class U> R call(U & u, void const *) const
+ {
+ return (get_pointer(u)->*f_)();
+ }
+
+public:
+
+ explicit cmf0(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u) const
+ {
+ U const * p = 0;
+ return call(u, p);
+ }
+
+ R operator()(T const & t) const
+ {
+ return (t.*f_)();
+ }
+
+ bool operator==(cmf0 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf0 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1 > class mf1
+{
+public:
+
+ typedef R result_type;
+ typedef T * first_argument_type;
+ typedef A1 second_argument_type;
+
+private:
+
+ typedef R ( T::*F) (A1);
+ F f_;
+
+ template<class U, class B1> R call(U & u, T const *, B1 & b1) const
+ {
+ return (u.*f_)(b1);
+ }
+
+ template<class U, class B1> R call(U & u, void const *, B1 & b1) const
+ {
+ return (get_pointer(u)->*f_)(b1);
+ }
+
+public:
+
+ explicit mf1(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1) const
+ {
+ return (p->*f_)(a1);
+ }
+
+ template<class U> R operator()(U & u, A1 a1) const
+ {
+ U const * p = 0;
+ return call(u, p, a1);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1) const
+ {
+ U const * p = 0;
+ return call(u, p, a1);
+ }
+
+
+
+ R operator()(T & t, A1 a1) const
+ {
+ return (t.*f_)(a1);
+ }
+
+ bool operator==(mf1 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf1 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1 > class cmf1
+{
+public:
+
+ typedef R result_type;
+ typedef T const * first_argument_type;
+ typedef A1 second_argument_type;
+
+private:
+
+ typedef R ( T::*F) (A1) const;
+ F f_;
+
+ template<class U, class B1> R call(U & u, T const *, B1 & b1) const
+ {
+ return (u.*f_)(b1);
+ }
+
+ template<class U, class B1> R call(U & u, void const *, B1 & b1) const
+ {
+ return (get_pointer(u)->*f_)(b1);
+ }
+
+public:
+
+ explicit cmf1(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1) const
+ {
+ U const * p = 0;
+ return call(u, p, a1);
+ }
+
+ R operator()(T const & t, A1 a1) const
+ {
+ return (t.*f_)(a1);
+ }
+
+ bool operator==(cmf1 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf1 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2 > class mf2
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2);
+ F f_;
+
+ template<class U, class B1, class B2> R call(U & u, T const *, B1 & b1, B2 & b2) const
+ {
+ return (u.*f_)(b1, b2);
+ }
+
+ template<class U, class B1, class B2> R call(U & u, void const *, B1 & b1, B2 & b2) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2);
+ }
+
+public:
+
+ explicit mf2(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2) const
+ {
+ return (p->*f_)(a1, a2);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2) const
+ {
+ return (t.*f_)(a1, a2);
+ }
+
+ bool operator==(mf2 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf2 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2 > class cmf2
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2) const;
+ F f_;
+
+ template<class U, class B1, class B2> R call(U & u, T const *, B1 & b1, B2 & b2) const
+ {
+ return (u.*f_)(b1, b2);
+ }
+
+ template<class U, class B1, class B2> R call(U & u, void const *, B1 & b1, B2 & b2) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2);
+ }
+
+public:
+
+ explicit cmf2(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2) const
+ {
+ return (t.*f_)(a1, a2);
+ }
+
+ bool operator==(cmf2 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf2 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3 > class mf3
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3);
+ F f_;
+
+ template<class U, class B1, class B2, class B3> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3) const
+ {
+ return (u.*f_)(b1, b2, b3);
+ }
+
+ template<class U, class B1, class B2, class B3> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3);
+ }
+
+public:
+
+ explicit mf3(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3) const
+ {
+ return (p->*f_)(a1, a2, a3);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3) const
+ {
+ return (t.*f_)(a1, a2, a3);
+ }
+
+ bool operator==(mf3 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf3 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3 > class cmf3
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3) const
+ {
+ return (u.*f_)(b1, b2, b3);
+ }
+
+ template<class U, class B1, class B2, class B3> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3);
+ }
+
+public:
+
+ explicit cmf3(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3) const
+ {
+ return (t.*f_)(a1, a2, a3);
+ }
+
+ bool operator==(cmf3 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf3 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4 > class mf4
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4);
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
+ {
+ return (u.*f_)(b1, b2, b3, b4);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4);
+ }
+
+public:
+
+ explicit mf4(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ return (p->*f_)(a1, a2, a3, a4);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ return (t.*f_)(a1, a2, a3, a4);
+ }
+
+ bool operator==(mf4 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf4 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4 > class cmf4
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
+ {
+ return (u.*f_)(b1, b2, b3, b4);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4);
+ }
+
+public:
+
+ explicit cmf4(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ return (t.*f_)(a1, a2, a3, a4);
+ }
+
+ bool operator==(cmf4 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf4 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5 > class mf5
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5);
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5);
+ }
+
+public:
+
+ explicit mf5(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ return (p->*f_)(a1, a2, a3, a4, a5);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5);
+ }
+
+ bool operator==(mf5 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf5 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5 > class cmf5
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5);
+ }
+
+public:
+
+ explicit cmf5(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5);
+ }
+
+ bool operator==(cmf5 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf5 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6 > class mf6
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6);
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6);
+ }
+
+public:
+
+ explicit mf6(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ return (p->*f_)(a1, a2, a3, a4, a5, a6);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6);
+ }
+
+ bool operator==(mf6 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf6 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6 > class cmf6
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6);
+ }
+
+public:
+
+ explicit cmf6(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6);
+ }
+
+ bool operator==(cmf6 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf6 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class mf7
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6, A7);
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6, b7);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7);
+ }
+
+public:
+
+ explicit mf7(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ return (p->*f_)(a1, a2, a3, a4, a5, a6, a7);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6, a7);
+ }
+
+ bool operator==(mf7 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf7 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class cmf7
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6, A7) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6, b7);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7);
+ }
+
+public:
+
+ explicit cmf7(F f): f_(f) {}
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6, a7);
+ }
+
+ bool operator==(cmf7 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf7 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class mf8
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6, A7, A8);
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
+ }
+
+public:
+
+ explicit mf8(F f): f_(f) {}
+
+ R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ return (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+ template<class U> R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+
+
+ R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+ bool operator==(mf8 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(mf8 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class cmf8
+{
+public:
+
+ typedef R result_type;
+
+private:
+
+ typedef R ( T::*F) (A1, A2, A3, A4, A5, A6, A7, A8) const;
+ F f_;
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, T const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
+ {
+ return (u.*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
+ }
+
+ template<class U, class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8> R call(U & u, void const *, B1 & b1, B2 & b2, B3 & b3, B4 & b4, B5 & b5, B6 & b6, B7 & b7, B8 & b8) const
+ {
+ return (get_pointer(u)->*f_)(b1, b2, b3, b4, b5, b6, b7, b8);
+ }
+
+public:
+
+ explicit cmf8(F f): f_(f) {}
+
+ R operator()(T const * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ return (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+ template<class U> R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ U const * p = 0;
+ return call(u, p, a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+ R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
+ {
+ return (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8);
+ }
+
+ bool operator==(cmf8 const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(cmf8 const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<class R, class T> _mfi::mf0<R, T> mem_fn(R ( T::*f) ())
+{
+ return _mfi::mf0<R, T>(f);
+}
+
+template<class R, class T> _mfi::cmf0<R, T> mem_fn(R ( T::*f) () const)
+{
+ return _mfi::cmf0<R, T>(f);
+}
+
+template<class R, class T, class A1> _mfi::mf1<R, T, A1> mem_fn(R ( T::*f) (A1))
+{
+ return _mfi::mf1<R, T, A1>(f);
+}
+
+template<class R, class T, class A1> _mfi::cmf1<R, T, A1> mem_fn(R ( T::*f) (A1) const)
+{
+ return _mfi::cmf1<R, T, A1>(f);
+}
+
+template<class R, class T, class A1, class A2> _mfi::mf2<R, T, A1, A2> mem_fn(R ( T::*f) (A1, A2))
+{
+ return _mfi::mf2<R, T, A1, A2>(f);
+}
+
+template<class R, class T, class A1, class A2> _mfi::cmf2<R, T, A1, A2> mem_fn(R ( T::*f) (A1, A2) const)
+{
+ return _mfi::cmf2<R, T, A1, A2>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3> _mfi::mf3<R, T, A1, A2, A3> mem_fn(R ( T::*f) (A1, A2, A3))
+{
+ return _mfi::mf3<R, T, A1, A2, A3>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3> _mfi::cmf3<R, T, A1, A2, A3> mem_fn(R ( T::*f) (A1, A2, A3) const)
+{
+ return _mfi::cmf3<R, T, A1, A2, A3>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4> _mfi::mf4<R, T, A1, A2, A3, A4> mem_fn(R ( T::*f) (A1, A2, A3, A4))
+{
+ return _mfi::mf4<R, T, A1, A2, A3, A4>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4> _mfi::cmf4<R, T, A1, A2, A3, A4> mem_fn(R ( T::*f) (A1, A2, A3, A4) const)
+{
+ return _mfi::cmf4<R, T, A1, A2, A3, A4>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5> _mfi::mf5<R, T, A1, A2, A3, A4, A5> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5))
+{
+ return _mfi::mf5<R, T, A1, A2, A3, A4, A5>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5> _mfi::cmf5<R, T, A1, A2, A3, A4, A5> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5) const)
+{
+ return _mfi::cmf5<R, T, A1, A2, A3, A4, A5>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> _mfi::mf6<R, T, A1, A2, A3, A4, A5, A6> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6))
+{
+ return _mfi::mf6<R, T, A1, A2, A3, A4, A5, A6>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6> _mfi::cmf6<R, T, A1, A2, A3, A4, A5, A6> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6) const)
+{
+ return _mfi::cmf6<R, T, A1, A2, A3, A4, A5, A6>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> _mfi::mf7<R, T, A1, A2, A3, A4, A5, A6, A7> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6, A7))
+{
+ return _mfi::mf7<R, T, A1, A2, A3, A4, A5, A6, A7>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7> _mfi::cmf7<R, T, A1, A2, A3, A4, A5, A6, A7> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6, A7) const)
+{
+ return _mfi::cmf7<R, T, A1, A2, A3, A4, A5, A6, A7>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> _mfi::mf8<R, T, A1, A2, A3, A4, A5, A6, A7, A8> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6, A7, A8))
+{
+ return _mfi::mf8<R, T, A1, A2, A3, A4, A5, A6, A7, A8>(f);
+}
+
+template<class R, class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> _mfi::cmf8<R, T, A1, A2, A3, A4, A5, A6, A7, A8> mem_fn(R ( T::*f) (A1, A2, A3, A4, A5, A6, A7, A8) const)
+{
+ return _mfi::cmf8<R, T, A1, A2, A3, A4, A5, A6, A7, A8>(f);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace _mfi
+{
+
+template<class R, class T> class dm
+{
+public:
+
+ typedef R const & result_type;
+ typedef T const * argument_type;
+
+private:
+
+ typedef R (T::*F);
+ F f_;
+
+ template<class U> R const & call(U & u, T const *) const
+ {
+ return (u.*f_);
+ }
+
+ template<class U> R const & call(U & u, void const *) const
+ {
+ return (get_pointer(u)->*f_);
+ }
+
+public:
+
+ explicit dm(F f): f_(f) {}
+
+ R & operator()(T * p) const
+ {
+ return (p->*f_);
+ }
+
+ R const & operator()(T const * p) const
+ {
+ return (p->*f_);
+ }
+
+ template<class U> R const & operator()(U const & u) const
+ {
+ return call(u, &u);
+ }
+
+
+
+ R & operator()(T & t) const
+ {
+ return (t.*f_);
+ }
+
+ R const & operator()(T const & t) const
+ {
+ return (t.*f_);
+ }
+
+
+
+ bool operator==(dm const & rhs) const
+ {
+ return f_ == rhs.f_;
+ }
+
+ bool operator!=(dm const & rhs) const
+ {
+ return f_ != rhs.f_;
+ }
+};
+
+}
+
+template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f)
+{
+ return _mfi::dm<R, T>(f);
+}
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma once
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R
+
+ >
+ struct function_invoker0
+ {
+ static R invoke(function_buffer& function_ptr
+ )
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f();
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R
+
+ >
+ struct void_function_invoker0
+ {
+ static void
+ invoke(function_buffer& function_ptr
+ )
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f();
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct function_obj_invoker0
+ {
+ static R invoke(function_buffer& function_obj_ptr
+ )
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)();
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct void_function_obj_invoker0
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr
+ )
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)();
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct function_ref_invoker0
+ {
+ static R invoke(function_buffer& function_obj_ptr
+ )
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)();
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct void_function_ref_invoker0
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr
+ )
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)();
+ }
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<
+ typename FunctionPtr,
+ typename R
+
+ >
+ struct get_function_invoker0
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker0<
+ FunctionPtr,
+ R
+
+ >,
+ function_invoker0<
+ FunctionPtr,
+ R
+
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct get_function_obj_invoker0
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker0<
+ FunctionObj,
+ R
+
+ >,
+ function_obj_invoker0<
+ FunctionObj,
+ R
+
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R
+
+ >
+ struct get_function_ref_invoker0
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker0<
+ FunctionObj,
+ R
+
+ >,
+ function_ref_invoker0<
+ FunctionObj,
+ R
+
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker0 { };
+
+
+ template<>
+ struct get_invoker0<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R >
+ struct apply
+ {
+ typedef typename get_function_invoker0<
+ FunctionPtr,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R ,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker0<
+ FunctionPtr,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<>
+ struct get_invoker0<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R >
+ struct apply
+ {
+ typedef typename get_function_obj_invoker0<
+ FunctionObj,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R ,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker0<
+ FunctionObj,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker0<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R >
+ struct apply
+ {
+ typedef typename get_function_ref_invoker0<
+ typename RefWrapper::type,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R ,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker0<
+ typename RefWrapper::type,
+ R
+
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R >
+ struct basic_vtable0
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+
+ );
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R
+
+ >
+ class function0 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable0<
+ R >
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 0;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 0;
+
+
+ typedef function0 self_type;
+
+ function0() : function_base() { }
+
+
+
+ template<typename Functor>
+ function0(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function0(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function0(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function0(const function0& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function0() { clear(); }
+
+ result_type operator()() const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor );
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function0&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function0& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function0& operator=(const function0& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function0& other)
+ {
+ if (&other == this)
+ return;
+
+ function0 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function0& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker0<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R
+ >
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker0<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R
+ ,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function0& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R >
+ inline void swap(function0<
+ R
+
+ >& f1,
+ function0<
+ R
+
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R >
+ void operator==(const function0<
+ R
+ >&,
+ const function0<
+ R
+ >&);
+template<typename R >
+ void operator!=(const function0<
+ R
+ >&,
+ const function0<
+ R
+ >& );
+
+
+
+
+
+
+
+
+
+template<typename R
+ >
+class function<R (void)>
+ : public function0<R >
+{
+ typedef function0<R > base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0
+ >
+ struct function_invoker1
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0
+ >
+ struct void_function_invoker1
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct function_obj_invoker1
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct void_function_obj_invoker1
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct function_ref_invoker1
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct void_function_ref_invoker1
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0
+ >
+ struct function_mem_invoker1
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0
+ >
+ struct function_void_mem_invoker1
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0
+ >
+ struct get_function_invoker1
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker1<
+ FunctionPtr,
+ R ,
+ T0
+ >,
+ function_invoker1<
+ FunctionPtr,
+ R ,
+ T0
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct get_function_obj_invoker1
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >,
+ function_obj_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0
+ >
+ struct get_function_ref_invoker1
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >,
+ function_ref_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0
+ >
+ struct get_member_invoker1
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker1<
+ MemberPtr,
+ R ,
+ T0
+ >,
+ function_mem_invoker1<
+ MemberPtr,
+ R ,
+ T0
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker1 { };
+
+
+ template<>
+ struct get_invoker1<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0>
+ struct apply
+ {
+ typedef typename get_function_invoker1<
+ FunctionPtr,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker1<
+ FunctionPtr,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker1<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0>
+ struct apply
+ {
+ typedef typename get_member_invoker1<
+ MemberPtr,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker1<
+ MemberPtr,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker1<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker1<
+ FunctionObj,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker1<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker1<
+ typename RefWrapper::type,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker1<
+ typename RefWrapper::type,
+ R ,
+ T0
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0>
+ struct basic_vtable1
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0
+ >
+ class function1 : public function_base
+
+
+
+ , public std::unary_function<T0,R>
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable1<
+ R , T0>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 1;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+ typedef T0 argument_type;
+
+
+
+
+
+ static const int arity = 1;
+ typedef T0 arg1_type;
+
+ typedef function1 self_type;
+
+ function1() : function_base() { }
+
+
+
+ template<typename Functor>
+ function1(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function1(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function1(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function1(const function1& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function1() { clear(); }
+
+ result_type operator()( T0 a0) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function1&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function1& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function1& operator=(const function1& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function1& other)
+ {
+ if (&other == this)
+ return;
+
+ function1 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function1& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker1<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker1<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function1& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0>
+ inline void swap(function1<
+ R ,
+ T0
+ >& f1,
+ function1<
+ R ,
+ T0
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0>
+ void operator==(const function1<
+ R ,
+ T0>&,
+ const function1<
+ R ,
+ T0>&);
+template<typename R , typename T0>
+ void operator!=(const function1<
+ R ,
+ T0>&,
+ const function1<
+ R ,
+ T0>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0>
+class function<R ( T0)>
+ : public function1<R , T0>
+{
+ typedef function1<R , T0> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct function_invoker2
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct void_function_invoker2
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct function_obj_invoker2
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct void_function_obj_invoker2
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct function_ref_invoker2
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct void_function_ref_invoker2
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct function_mem_invoker2
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct function_void_mem_invoker2
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct get_function_invoker2
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker2<
+ FunctionPtr,
+ R ,
+ T0 , T1
+ >,
+ function_invoker2<
+ FunctionPtr,
+ R ,
+ T0 , T1
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct get_function_obj_invoker2
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >,
+ function_obj_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct get_function_ref_invoker2
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >,
+ function_ref_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1
+ >
+ struct get_member_invoker2
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker2<
+ MemberPtr,
+ R ,
+ T0 , T1
+ >,
+ function_mem_invoker2<
+ MemberPtr,
+ R ,
+ T0 , T1
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker2 { };
+
+
+ template<>
+ struct get_invoker2<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1>
+ struct apply
+ {
+ typedef typename get_function_invoker2<
+ FunctionPtr,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker2<
+ FunctionPtr,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker2<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1>
+ struct apply
+ {
+ typedef typename get_member_invoker2<
+ MemberPtr,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker2<
+ MemberPtr,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker2<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker2<
+ FunctionObj,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker2<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker2<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker2<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1>
+ struct basic_vtable2
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1
+ >
+ class function2 : public function_base
+
+
+
+
+
+
+
+ , public std::binary_function<T0,T1,R>
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable2<
+ R , T0 , T1>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 2;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+ typedef T0 first_argument_type;
+ typedef T1 second_argument_type;
+
+
+ static const int arity = 2;
+ typedef T0 arg1_type; typedef T1 arg2_type;
+
+ typedef function2 self_type;
+
+ function2() : function_base() { }
+
+
+
+ template<typename Functor>
+ function2(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function2(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function2(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function2(const function2& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function2() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function2&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function2& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function2& operator=(const function2& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function2& other)
+ {
+ if (&other == this)
+ return;
+
+ function2 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function2& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker2<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker2<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function2& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1>
+ inline void swap(function2<
+ R ,
+ T0 , T1
+ >& f1,
+ function2<
+ R ,
+ T0 , T1
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1>
+ void operator==(const function2<
+ R ,
+ T0 , T1>&,
+ const function2<
+ R ,
+ T0 , T1>&);
+template<typename R , typename T0 , typename T1>
+ void operator!=(const function2<
+ R ,
+ T0 , T1>&,
+ const function2<
+ R ,
+ T0 , T1>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1>
+class function<R ( T0 , T1)>
+ : public function2<R , T0 , T1>
+{
+ typedef function2<R , T0 , T1> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct function_invoker3
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct void_function_invoker3
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct function_obj_invoker3
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct void_function_obj_invoker3
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct function_ref_invoker3
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct void_function_ref_invoker3
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct function_mem_invoker3
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct function_void_mem_invoker3
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct get_function_invoker3
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker3<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2
+ >,
+ function_invoker3<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct get_function_obj_invoker3
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >,
+ function_obj_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct get_function_ref_invoker3
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >,
+ function_ref_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ struct get_member_invoker3
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker3<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2
+ >,
+ function_mem_invoker3<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker3 { };
+
+
+ template<>
+ struct get_invoker3<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2>
+ struct apply
+ {
+ typedef typename get_function_invoker3<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker3<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker3<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2>
+ struct apply
+ {
+ typedef typename get_member_invoker3<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker3<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker3<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker3<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker3<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker3<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker3<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2>
+ struct basic_vtable3
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2
+ >
+ class function3 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable3<
+ R , T0 , T1 , T2>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 3;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 3;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type;
+
+ typedef function3 self_type;
+
+ function3() : function_base() { }
+
+
+
+ template<typename Functor>
+ function3(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function3(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function3(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function3(const function3& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function3() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function3&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function3& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function3& operator=(const function3& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function3& other)
+ {
+ if (&other == this)
+ return;
+
+ function3 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function3& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker3<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker3<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function3& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2>
+ inline void swap(function3<
+ R ,
+ T0 , T1 , T2
+ >& f1,
+ function3<
+ R ,
+ T0 , T1 , T2
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2>
+ void operator==(const function3<
+ R ,
+ T0 , T1 , T2>&,
+ const function3<
+ R ,
+ T0 , T1 , T2>&);
+template<typename R , typename T0 , typename T1 , typename T2>
+ void operator!=(const function3<
+ R ,
+ T0 , T1 , T2>&,
+ const function3<
+ R ,
+ T0 , T1 , T2>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2>
+class function<R ( T0 , T1 , T2)>
+ : public function3<R , T0 , T1 , T2>
+{
+ typedef function3<R , T0 , T1 , T2> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct function_invoker4
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct void_function_invoker4
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct function_obj_invoker4
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct void_function_obj_invoker4
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct function_ref_invoker4
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct void_function_ref_invoker4
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct function_mem_invoker4
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct function_void_mem_invoker4
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct get_function_invoker4
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker4<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >,
+ function_invoker4<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct get_function_obj_invoker4
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >,
+ function_obj_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct get_function_ref_invoker4
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >,
+ function_ref_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ struct get_member_invoker4
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker4<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >,
+ function_mem_invoker4<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker4 { };
+
+
+ template<>
+ struct get_invoker4<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ struct apply
+ {
+ typedef typename get_function_invoker4<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker4<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker4<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ struct apply
+ {
+ typedef typename get_member_invoker4<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker4<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker4<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker4<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker4<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker4<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker4<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ struct basic_vtable4
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3
+ >
+ class function4 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable4<
+ R , T0 , T1 , T2 , T3>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 4;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 4;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type;
+
+ typedef function4 self_type;
+
+ function4() : function_base() { }
+
+
+
+ template<typename Functor>
+ function4(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function4(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function4(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function4(const function4& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function4() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function4&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function4& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function4& operator=(const function4& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function4& other)
+ {
+ if (&other == this)
+ return;
+
+ function4 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function4& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker4<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker4<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function4& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ inline void swap(function4<
+ R ,
+ T0 , T1 , T2 , T3
+ >& f1,
+ function4<
+ R ,
+ T0 , T1 , T2 , T3
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ void operator==(const function4<
+ R ,
+ T0 , T1 , T2 , T3>&,
+ const function4<
+ R ,
+ T0 , T1 , T2 , T3>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3>
+ void operator!=(const function4<
+ R ,
+ T0 , T1 , T2 , T3>&,
+ const function4<
+ R ,
+ T0 , T1 , T2 , T3>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3>
+class function<R ( T0 , T1 , T2 , T3)>
+ : public function4<R , T0 , T1 , T2 , T3>
+{
+ typedef function4<R , T0 , T1 , T2 , T3> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct function_invoker5
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct void_function_invoker5
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct function_obj_invoker5
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct void_function_obj_invoker5
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct function_ref_invoker5
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct void_function_ref_invoker5
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct function_mem_invoker5
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct function_void_mem_invoker5
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct get_function_invoker5
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker5<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >,
+ function_invoker5<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct get_function_obj_invoker5
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >,
+ function_obj_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct get_function_ref_invoker5
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >,
+ function_ref_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ struct get_member_invoker5
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker5<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >,
+ function_mem_invoker5<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker5 { };
+
+
+ template<>
+ struct get_invoker5<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ struct apply
+ {
+ typedef typename get_function_invoker5<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker5<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker5<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ struct apply
+ {
+ typedef typename get_member_invoker5<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker5<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker5<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker5<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker5<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker5<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker5<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ struct basic_vtable5
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4
+ >
+ class function5 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable5<
+ R , T0 , T1 , T2 , T3 , T4>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 5;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 5;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type;
+
+ typedef function5 self_type;
+
+ function5() : function_base() { }
+
+
+
+ template<typename Functor>
+ function5(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function5(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function5(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function5(const function5& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function5() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function5&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function5& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function5& operator=(const function5& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function5& other)
+ {
+ if (&other == this)
+ return;
+
+ function5 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function5& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker5<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker5<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function5& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ inline void swap(function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >& f1,
+ function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ void operator==(const function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4>&,
+ const function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+ void operator!=(const function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4>&,
+ const function5<
+ R ,
+ T0 , T1 , T2 , T3 , T4>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
+class function<R ( T0 , T1 , T2 , T3 , T4)>
+ : public function5<R , T0 , T1 , T2 , T3 , T4>
+{
+ typedef function5<R , T0 , T1 , T2 , T3 , T4> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct function_invoker6
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct void_function_invoker6
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct function_obj_invoker6
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct void_function_obj_invoker6
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct function_ref_invoker6
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct void_function_ref_invoker6
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct function_mem_invoker6
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct function_void_mem_invoker6
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct get_function_invoker6
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker6<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >,
+ function_invoker6<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct get_function_obj_invoker6
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >,
+ function_obj_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct get_function_ref_invoker6
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >,
+ function_ref_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ struct get_member_invoker6
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker6<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >,
+ function_mem_invoker6<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker6 { };
+
+
+ template<>
+ struct get_invoker6<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ struct apply
+ {
+ typedef typename get_function_invoker6<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker6<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker6<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ struct apply
+ {
+ typedef typename get_member_invoker6<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker6<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker6<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker6<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker6<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker6<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker6<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ struct basic_vtable6
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4 , T5);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5
+ >
+ class function6 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable6<
+ R , T0 , T1 , T2 , T3 , T4 , T5>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 6;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 6;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type; typedef T5 arg6_type;
+
+ typedef function6 self_type;
+
+ function6() : function_base() { }
+
+
+
+ template<typename Functor>
+ function6(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function6(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function6(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function6(const function6& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function6() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4 , a5);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function6&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function6& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function6& operator=(const function6& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function6& other)
+ {
+ if (&other == this)
+ return;
+
+ function6 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function6& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker6<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker6<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function6& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ inline void swap(function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >& f1,
+ function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ void operator==(const function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5>&,
+ const function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+ void operator!=(const function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5>&,
+ const function6<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
+class function<R ( T0 , T1 , T2 , T3 , T4 , T5)>
+ : public function6<R , T0 , T1 , T2 , T3 , T4 , T5>
+{
+ typedef function6<R , T0 , T1 , T2 , T3 , T4 , T5> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct function_invoker7
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct void_function_invoker7
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct function_obj_invoker7
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct void_function_obj_invoker7
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct function_ref_invoker7
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct void_function_ref_invoker7
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct function_mem_invoker7
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct function_void_mem_invoker7
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct get_function_invoker7
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker7<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >,
+ function_invoker7<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct get_function_obj_invoker7
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >,
+ function_obj_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct get_function_ref_invoker7
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >,
+ function_ref_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ struct get_member_invoker7
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker7<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >,
+ function_mem_invoker7<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker7 { };
+
+
+ template<>
+ struct get_invoker7<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ struct apply
+ {
+ typedef typename get_function_invoker7<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker7<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker7<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ struct apply
+ {
+ typedef typename get_member_invoker7<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker7<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker7<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker7<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker7<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker7<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker7<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ struct basic_vtable7
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6
+ >
+ class function7 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable7<
+ R , T0 , T1 , T2 , T3 , T4 , T5 , T6>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 7;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 7;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type; typedef T5 arg6_type; typedef T6 arg7_type;
+
+ typedef function7 self_type;
+
+ function7() : function_base() { }
+
+
+
+ template<typename Functor>
+ function7(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function7(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function7(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function7(const function7& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function7() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4 , a5 , a6);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function7&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function7& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function7& operator=(const function7& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function7& other)
+ {
+ if (&other == this)
+ return;
+
+ function7 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function7& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker7<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker7<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function7& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ inline void swap(function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >& f1,
+ function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ void operator==(const function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6>&,
+ const function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+ void operator!=(const function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6>&,
+ const function7<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
+class function<R ( T0 , T1 , T2 , T3 , T4 , T5 , T6)>
+ : public function7<R , T0 , T1 , T2 , T3 , T4 , T5 , T6>
+{
+ typedef function7<R , T0 , T1 , T2 , T3 , T4 , T5 , T6> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct function_invoker8
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct void_function_invoker8
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct function_obj_invoker8
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct void_function_obj_invoker8
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct function_ref_invoker8
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct void_function_ref_invoker8
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct function_mem_invoker8
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct function_void_mem_invoker8
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct get_function_invoker8
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker8<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >,
+ function_invoker8<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct get_function_obj_invoker8
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >,
+ function_obj_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct get_function_ref_invoker8
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >,
+ function_ref_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ struct get_member_invoker8
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker8<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >,
+ function_mem_invoker8<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker8 { };
+
+
+ template<>
+ struct get_invoker8<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ struct apply
+ {
+ typedef typename get_function_invoker8<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker8<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker8<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ struct apply
+ {
+ typedef typename get_member_invoker8<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker8<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker8<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker8<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker8<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker8<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker8<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ struct basic_vtable8
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7
+ >
+ class function8 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable8<
+ R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 8;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 8;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type; typedef T5 arg6_type; typedef T6 arg7_type; typedef T7 arg8_type;
+
+ typedef function8 self_type;
+
+ function8() : function_base() { }
+
+
+
+ template<typename Functor>
+ function8(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function8(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function8(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function8(const function8& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function8() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function8&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function8& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function8& operator=(const function8& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function8& other)
+ {
+ if (&other == this)
+ return;
+
+ function8 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function8& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker8<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker8<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function8& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ inline void swap(function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >& f1,
+ function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ void operator==(const function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>&,
+ const function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+ void operator!=(const function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>&,
+ const function8<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
+class function<R ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)>
+ : public function8<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7>
+{
+ typedef function8<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct function_invoker9
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct void_function_invoker9
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct function_obj_invoker9
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct void_function_obj_invoker9
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct function_ref_invoker9
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct void_function_ref_invoker9
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct function_mem_invoker9
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct function_void_mem_invoker9
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct get_function_invoker9
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker9<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >,
+ function_invoker9<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct get_function_obj_invoker9
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >,
+ function_obj_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct get_function_ref_invoker9
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >,
+ function_ref_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ struct get_member_invoker9
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker9<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >,
+ function_mem_invoker9<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker9 { };
+
+
+ template<>
+ struct get_invoker9<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ struct apply
+ {
+ typedef typename get_function_invoker9<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker9<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker9<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ struct apply
+ {
+ typedef typename get_member_invoker9<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker9<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker9<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker9<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker9<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker9<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker9<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ struct basic_vtable9
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8
+ >
+ class function9 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable9<
+ R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 9;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 9;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type; typedef T5 arg6_type; typedef T6 arg7_type; typedef T7 arg8_type; typedef T8 arg9_type;
+
+ typedef function9 self_type;
+
+ function9() : function_base() { }
+
+
+
+ template<typename Functor>
+ function9(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function9(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function9(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function9(const function9& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function9() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function9&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function9& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function9& operator=(const function9& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function9& other)
+ {
+ if (&other == this)
+ return;
+
+ function9 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function9& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker9<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker9<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function9& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ inline void swap(function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >& f1,
+ function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ void operator==(const function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>&,
+ const function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+ void operator!=(const function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>&,
+ const function9<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
+class function<R ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)>
+ : public function9<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8>
+{
+ typedef function9<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( push )
+#pragma warning( disable : 4127 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+ namespace detail {
+ namespace function {
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct function_invoker10
+ {
+ static R invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ return f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct void_function_invoker10
+ {
+ static void
+ invoke(function_buffer& function_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
+ f( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct function_obj_invoker10
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct void_function_obj_invoker10
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ FunctionObj* f;
+ if (function_allows_small_object_optimization<FunctionObj>::value)
+ f = reinterpret_cast<FunctionObj*>(&function_obj_ptr.data);
+ else
+ f = reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct function_ref_invoker10
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ return (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct void_function_ref_invoker10
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ FunctionObj* f =
+ reinterpret_cast<FunctionObj*>(function_obj_ptr.obj_ptr);
+ (*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct function_mem_invoker10
+ {
+ static R invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ return boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct function_void_mem_invoker10
+ {
+ static void
+ invoke(function_buffer& function_obj_ptr ,
+ T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9)
+
+ {
+ MemberPtr* f =
+ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
+ boost::mem_fn(*f)( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+ };
+
+
+ template<
+ typename FunctionPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct get_function_invoker10
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_invoker10<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >,
+ function_invoker10<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct get_function_obj_invoker10
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_obj_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >,
+ function_obj_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >
+ >::type type;
+ };
+
+ template<
+ typename FunctionObj,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct get_function_ref_invoker10
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ void_function_ref_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >,
+ function_ref_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >
+ >::type type;
+ };
+
+
+
+ template<
+ typename MemberPtr,
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ struct get_member_invoker10
+ {
+ typedef typename mpl::if_c<(is_void<R>::value),
+ function_void_mem_invoker10<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >,
+ function_mem_invoker10<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >
+ >::type type;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ template<typename Tag>
+ struct get_invoker10 { };
+
+
+ template<>
+ struct get_invoker10<function_ptr_tag>
+ {
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ struct apply
+ {
+ typedef typename get_function_invoker10<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+
+ template<typename FunctionPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_invoker10<
+ FunctionPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker10<member_ptr_tag>
+ {
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ struct apply
+ {
+ typedef typename get_member_invoker10<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+
+ template<typename MemberPtr,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_member_invoker10<
+ MemberPtr,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager<MemberPtr> manager_type;
+ };
+ };
+
+
+
+ template<>
+ struct get_invoker10<function_obj_tag>
+ {
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ struct apply
+ {
+ typedef typename get_function_obj_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager<FunctionObj> manager_type;
+ };
+
+ template<typename FunctionObj,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_obj_invoker10<
+ FunctionObj,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef functor_manager_a<FunctionObj, Allocator> manager_type;
+ };
+ };
+
+
+ template<>
+ struct get_invoker10<function_obj_ref_tag>
+ {
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ struct apply
+ {
+ typedef typename get_function_ref_invoker10<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+
+ template<typename RefWrapper,
+ typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9,
+ typename Allocator>
+ struct apply_a
+ {
+ typedef typename get_function_ref_invoker10<
+ typename RefWrapper::type,
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >::type
+ invoker_type;
+
+ typedef reference_manager<typename RefWrapper::type> manager_type;
+ };
+ };
+
+
+
+
+
+
+
+
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ struct basic_vtable10
+ {
+
+ typedef R result_type;
+
+
+
+
+ typedef result_type (*invoker_type)(function_buffer&
+ ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9);
+
+ template<typename F>
+ bool assign_to(F f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+ template<typename F,typename Allocator>
+ bool assign_to_a(F f, function_buffer& functor, Allocator a) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to_a(f, functor, a, tag());
+ }
+
+ void clear(function_buffer& functor) const
+ {
+ if (base.manager)
+ base.manager(functor, functor, destroy_functor_tag);
+ }
+
+ private:
+
+ template<typename FunctionPtr>
+ bool
+ assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+
+
+ functor.func_ptr = reinterpret_cast<void (*)()>(f);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionPtr,typename Allocator>
+ bool
+ assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
+ {
+ return assign_to(f,functor,function_ptr_tag());
+ }
+
+
+
+ template<typename MemberPtr>
+ bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to(boost::mem_fn(f), functor);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename MemberPtr,typename Allocator>
+ bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
+ {
+
+
+
+ if (f) {
+ this->assign_to_a(boost::mem_fn(f), functor, a);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
+ {
+ new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
+ {
+ assign_functor(f,functor,mpl::true_());
+ }
+
+
+ template<typename FunctionObj>
+ void
+ assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
+ {
+ functor.obj_ptr = new FunctionObj(f);
+ }
+ template<typename FunctionObj,typename Allocator>
+ void
+ assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
+ {
+ typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
+ typedef typename Allocator::template rebind<functor_wrapper_type>::other
+ wrapper_allocator_type;
+ typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type;
+ wrapper_allocator_type wrapper_allocator(a);
+ wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
+ wrapper_allocator.construct(copy, functor_wrapper_type(f,a));
+ functor_wrapper_type* new_f = static_cast<functor_wrapper_type*>(copy);
+ functor.obj_ptr = new_f;
+ }
+
+ template<typename FunctionObj>
+ bool
+ assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor_a(f, functor, a,
+ mpl::bool_<(function_allows_small_object_optimization<FunctionObj>::value)>());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, function_obj_ref_tag) const
+ {
+ functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
+ functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+ functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+ return true;
+ }
+ template<typename FunctionObj,typename Allocator>
+ bool
+ assign_to_a(const reference_wrapper<FunctionObj>& f,
+ function_buffer& functor, Allocator, function_obj_ref_tag) const
+ {
+ return assign_to(f,functor,function_obj_ref_tag());
+ }
+
+ public:
+ vtable_base base;
+ invoker_type invoker;
+ };
+ }
+ }
+
+ template<
+ typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9
+ >
+ class function10 : public function_base
+
+
+
+
+
+
+
+
+
+
+
+ {
+ public:
+
+ typedef R result_type;
+
+
+
+
+
+ private:
+ typedef boost::detail::function::basic_vtable10<
+ R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>
+ vtable_type;
+
+ vtable_type* get_vtable() const {
+ return reinterpret_cast<vtable_type*>(
+ reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
+ }
+
+ struct clear_type {};
+
+ public:
+ static const int args = 10;
+
+
+ template<typename Args>
+ struct sig
+ {
+ typedef result_type type;
+ };
+
+
+
+
+
+
+
+
+ static const int arity = 10;
+ typedef T0 arg1_type; typedef T1 arg2_type; typedef T2 arg3_type; typedef T3 arg4_type; typedef T4 arg5_type; typedef T5 arg6_type; typedef T6 arg7_type; typedef T7 arg8_type; typedef T8 arg9_type; typedef T9 arg10_type;
+
+ typedef function10 self_type;
+
+ function10() : function_base() { }
+
+
+
+ template<typename Functor>
+ function10(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to(f);
+ }
+ template<typename Functor,typename Allocator>
+ function10(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ function_base()
+ {
+ this->assign_to_a(f,a);
+ }
+
+
+ function10(clear_type*) : function_base() { }
+
+
+
+
+
+
+
+ function10(const function10& f) : function_base()
+ {
+ this->assign_to_own(f);
+ }
+
+ ~function10() { clear(); }
+
+ result_type operator()( T0 a0 , T1 a1 , T2 a2 , T3 a3 , T4 a4 , T5 a5 , T6 a6 , T7 a7 , T8 a8 , T9 a9) const
+ {
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+ return get_vtable()->invoker
+ (this->functor , a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
+ }
+
+
+
+
+
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ function10&>::type
+
+
+
+ operator=(Functor f)
+ {
+ this->clear();
+ { try {
+ this->assign_to(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+ template<typename Functor,typename Allocator>
+ void assign(Functor f, Allocator a)
+ {
+ this->clear();
+ { try{
+ this->assign_to_a(f,a);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+
+
+ function10& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+
+
+
+
+
+
+
+
+ function10& operator=(const function10& f)
+ {
+ if (&f == this)
+ return *this;
+
+ this->clear();
+ { try {
+ this->assign_to_own(f);
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ return *this;
+ }
+
+ void swap(function10& other)
+ {
+ if (&other == this)
+ return;
+
+ function10 tmp;
+ tmp.move_assign(*this);
+ this->move_assign(other);
+ other.move_assign(tmp);
+ }
+
+
+ void clear()
+ {
+ if (vtable) {
+ if (!this->has_trivial_copy_and_destroy())
+ get_vtable()->clear(this->functor);
+ vtable = 0;
+ }
+ }
+
+
+
+
+
+ private:
+ struct dummy {
+ void nonnull() {}
+ };
+
+ typedef void (dummy::*safe_bool)();
+
+ public:
+ operator safe_bool () const
+ { return (this->empty())? 0 : &dummy::nonnull; }
+
+ bool operator!() const
+ { return this->empty(); }
+
+
+ private:
+ void assign_to_own(const function10& f)
+ {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::clone_functor_tag);
+ }
+ }
+
+ template<typename Functor>
+ void assign_to(Functor f)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker10<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to(f, functor)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+ template<typename Functor,typename Allocator>
+ void assign_to_a(Functor f,Allocator a)
+ {
+ using detail::function::vtable_base;
+
+ typedef typename detail::function::get_function_tag<Functor>::type tag;
+ typedef detail::function::get_invoker10<tag> get_invoker;
+ typedef typename get_invoker::
+ template apply_a<Functor, R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9,
+ Allocator>
+ handler_type;
+
+ typedef typename handler_type::invoker_type invoker_type;
+ typedef typename handler_type::manager_type manager_type;
+
+
+
+
+
+ static const vtable_type stored_vtable =
+ { { &manager_type::manage }, &invoker_type::invoke };
+
+ if (stored_vtable.assign_to_a(f, functor, a)) {
+ std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+ if (boost::has_trivial_copy_constructor<Functor>::value &&
+ boost::has_trivial_destructor<Functor>::value &&
+ detail::function::function_allows_small_object_optimization<Functor>::value)
+ value |= static_cast<std::size_t>(0x01);
+ vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+ } else
+ vtable = 0;
+ }
+
+
+
+
+ void move_assign(function10& f)
+ {
+ if (&f == this)
+ return;
+
+ { try {
+ if (!f.empty()) {
+ this->vtable = f.vtable;
+ if (this->has_trivial_copy_and_destroy())
+ this->functor = f.functor;
+ else
+ get_vtable()->base.manager(f.functor, this->functor,
+ boost::detail::function::move_functor_tag);
+ f.vtable = 0;
+ } else {
+ clear();
+ }
+ } catch(...) {
+ vtable = 0;
+ throw;;
+ }
+ }
+ }
+ };
+
+ template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ inline void swap(function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >& f1,
+ function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9
+ >& f2)
+ {
+ f1.swap(f2);
+ }
+
+
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ void operator==(const function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>&,
+ const function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>&);
+template<typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+ void operator!=(const function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>&,
+ const function10<
+ R ,
+ T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>& );
+
+
+
+
+
+
+
+
+
+template<typename R ,
+ typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
+class function<R ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)>
+ : public function10<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9>
+{
+ typedef function10<R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9> base_type;
+ typedef function self_type;
+
+ struct clear_type {};
+
+public:
+
+ function() : base_type() {}
+
+ template<typename Functor>
+ function(Functor f
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f)
+ {
+ }
+ template<typename Functor,typename Allocator>
+ function(Functor f, Allocator a
+
+ ,typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ int>::type = 0
+
+ ) :
+ base_type(f,a)
+ {
+ }
+
+
+ function(clear_type*) : base_type() {}
+
+
+ function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ function(const base_type& f) : base_type(static_cast<const base_type&>(f)){}
+
+ self_type& operator=(const self_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+ template<typename Functor>
+
+ typename enable_if_c<
+ (boost::type_traits::ice_not<
+ (is_integral<Functor>::value)>::value),
+ self_type&>::type
+
+
+
+ operator=(Functor f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+
+
+ self_type& operator=(clear_type*)
+ {
+ this->clear();
+ return *this;
+ }
+
+
+ self_type& operator=(const base_type& f)
+ {
+ self_type(f).swap(*this);
+ return *this;
+ }
+};
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#pragma warning( pop )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace functional { namespace detail {
+
+template<typename F>
+class overload_base {
+
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+
+
+>
+class overload_base< R () > {
+public:
+ inline overload_base(
+
+
+ boost::function< R () > const& f): f_(f)
+ {}
+
+ inline R operator()() const {
+ return f_();
+ }
+
+private:
+ boost::function< R () > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+ ,
+ typename A0
+>
+class overload_base< R ( A0) > {
+public:
+ inline overload_base(
+
+
+ boost::function< R ( A0) > const& f): f_(f)
+ {}
+
+ inline R operator()( A0 a0) const {
+ return f_( a0);
+ }
+
+private:
+ boost::function< R ( A0) > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class overload_base< R ( A0 , A1) > {
+public:
+ inline overload_base(
+
+
+ boost::function< R ( A0 , A1) > const& f): f_(f)
+ {}
+
+ inline R operator()( A0 a0 , A1 a1) const {
+ return f_( a0 , a1);
+ }
+
+private:
+ boost::function< R ( A0 , A1) > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class overload_base< R ( A0 , A1 , A2) > {
+public:
+ inline overload_base(
+
+
+ boost::function< R ( A0 , A1 , A2) > const& f): f_(f)
+ {}
+
+ inline R operator()( A0 a0 , A1 a1 , A2 a2) const {
+ return f_( a0 , a1 , a2);
+ }
+
+private:
+ boost::function< R ( A0 , A1 , A2) > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class overload_base< R ( A0 , A1 , A2 , A3) > {
+public:
+ inline overload_base(
+
+
+ boost::function< R ( A0 , A1 , A2 , A3) > const& f): f_(f)
+ {}
+
+ inline R operator()( A0 a0 , A1 a1 , A2 a2 , A3 a3) const {
+ return f_( a0 , a1 , a2 , a3);
+ }
+
+private:
+ boost::function< R ( A0 , A1 , A2 , A3) > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class overload_base< R ( A0 , A1 , A2 , A3 , A4) > {
+public:
+ inline overload_base(
+
+
+ boost::function< R ( A0 , A1 , A2 , A3 , A4) > const& f): f_(f)
+ {}
+
+ inline R operator()( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4) const {
+ return f_( a0 , a1 , a2 , a3 , a4);
+ }
+
+private:
+ boost::function< R ( A0 , A1 , A2 , A3 , A4) > const f_;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct at_impl;
+template< typename Sequence, typename N > struct at;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+struct v_iter_tag;
+
+
+
+
+template< long N > struct vector_tag;
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< long N > struct long_;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< long N >
+struct long_
+{
+ static const long value = N;
+
+
+
+
+
+ typedef long_ type;
+
+ typedef long value_type;
+ typedef integral_c_tag tag;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ typedef boost::mpl::long_< static_cast<long>((value + 1)) > next;
+ typedef boost::mpl::long_< static_cast<long>((value - 1)) > prior;
+
+
+
+
+
+
+ operator long() const { return static_cast<long>(this->value); }
+};
+
+
+template< long N >
+long const boost::mpl::long_< N >::value;
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+struct void_ { typedef void_ type; };
+
+}}
+
+namespace boost { namespace mpl {
+
+template< typename T >
+struct is_void_
+ : false_
+{
+
+
+
+};
+
+template<>
+struct is_void_<void_>
+ : true_
+{
+
+
+
+};
+
+template< typename T >
+struct is_not_void_
+ : true_
+{
+
+
+
+};
+
+template<>
+struct is_not_void_<void_>
+ : false_
+{
+
+
+
+};
+
+template<> struct is_void_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : is_void_< T1 > { }; }; template< typename Tag > struct lambda< is_void_< na > , Tag > { typedef false_ is_le; typedef is_void_< na > result_; typedef is_void_< na > type; };
+template<> struct is_not_void_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : is_not_void_< T1 > { }; }; template< typename Tag > struct lambda< is_not_void_< na > , Tag > { typedef false_ is_le; typedef is_not_void_< na > result_; typedef is_not_void_< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct type_wrapper
+{
+ typedef T type;
+};
+
+
+
+
+
+
+template< typename T > struct wrapped_type;
+
+template< typename T > struct wrapped_type< type_wrapper<T> >
+{
+ typedef T type;
+};
+
+
+
+
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename Vector, long n_ > struct v_at;
+
+template< long n_ >
+struct at_impl< aux::vector_tag<n_> >
+{
+ template< typename Vector, typename N > struct apply
+
+ : v_at<
+ Vector
+ , N::value
+ >
+ {
+
+
+
+
+
+
+
+ };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct front_impl;
+template< typename Sequence > struct front;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< long n_ >
+struct front_impl< aux::vector_tag<n_> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef typename Vector::item0 type;
+ };
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct push_front_impl;
+template< typename Sequence, typename T > struct push_front;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct pop_front_impl;
+template< typename Sequence > struct pop_front;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct push_back_impl;
+template< typename Sequence, typename T > struct push_back;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct pop_back_impl;
+template< typename Sequence > struct pop_back;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct back_impl;
+template< typename Sequence > struct back;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+template<
+ typename T = na
+ >
+struct next
+{
+ typedef typename T::next type;
+
+};
+
+template<
+ typename T = na
+ >
+struct prior
+{
+ typedef typename T::prior type;
+
+};
+
+template<> struct next< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : next< T1 > { }; }; template< typename Tag > struct lambda< next< na > , Tag > { typedef false_ is_le; typedef next< na > result_; typedef next< na > type; };
+template<> struct prior< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : prior< T1 > { }; }; template< typename Tag > struct lambda< prior< na > , Tag > { typedef false_ is_le; typedef prior< na > result_; typedef prior< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< long n_ >
+struct back_impl< aux::vector_tag<n_> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef typename Vector::back type;
+ };
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct clear_impl;
+template< typename Sequence > struct clear;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct forward_iterator_tag : int_<0> { typedef forward_iterator_tag type; };
+struct bidirectional_iterator_tag : int_<1> { typedef bidirectional_iterator_tag type; };
+struct random_access_iterator_tag : int_<2> { typedef random_access_iterator_tag type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct integral_rank;
+
+template<> struct integral_rank<bool> : int_<1> {};
+template<> struct integral_rank<signed char> : int_<2> {};
+template<> struct integral_rank<char> : int_<3> {};
+template<> struct integral_rank<unsigned char> : int_<4> {};
+
+template<> struct integral_rank<wchar_t> : int_<5> {};
+
+template<> struct integral_rank<short> : int_<6> {};
+template<> struct integral_rank<unsigned short> : int_<7> {};
+template<> struct integral_rank<int> : int_<8> {};
+template<> struct integral_rank<unsigned int> : int_<9> {};
+template<> struct integral_rank<long> : int_<10> {};
+template<> struct integral_rank<unsigned long> : int_<11> {};
+
+
+template<> struct integral_rank<long_long_type> : int_<12> {};
+template<> struct integral_rank<ulong_long_type>: int_<13> {};
+
+
+template< typename T1, typename T2 > struct largest_int
+
+ : if_c<
+ ( integral_rank<T1>::value >= integral_rank<T2>::value )
+ , T1
+ , T2
+ >
+{
+
+
+
+
+
+
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template< typename SourceTag, typename TargetTag > struct numeric_cast
+{
+ template< typename N > struct apply;
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+typedef char (&no_tag)[1];
+typedef char (&yes_tag)[2];
+
+template< bool C_ > struct yes_no_tag
+{
+ typedef no_tag type;
+};
+
+template<> struct yes_no_tag<true>
+{
+ typedef yes_tag type;
+};
+
+
+template< long n > struct weighted_tag
+{
+
+ typedef char (&type)[n];
+
+
+
+
+};
+
+
+
+
+
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< typename T > struct has_apply_msvc_sfinae_helper { typedef void type; };template< typename T, typename U = void > struct has_apply_impl_ { static const bool value = false; typedef boost::mpl::bool_<value> type; }; template< typename T > struct has_apply_impl_< T , typename has_apply_msvc_sfinae_helper< typename T::apply >::type > { static const bool value = true; typedef boost::mpl::bool_<value> type; }; template< typename T, typename fallback_ = boost::mpl::bool_<false> > struct has_apply : has_apply_impl_<T> { };
+
+
+
+
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename F
+
+ , typename has_apply_ = typename aux::has_apply<F>::type
+
+ >
+struct apply_wrap0
+
+ : F::template apply< >
+{
+};
+
+template< typename F >
+struct apply_wrap0< F,true_ >
+ : F::apply
+{
+};
+
+template<
+ typename F, typename T1
+
+ >
+struct apply_wrap1
+
+ : F::template apply<T1>
+{
+};
+
+template<
+ typename F, typename T1, typename T2
+
+ >
+struct apply_wrap2
+
+ : F::template apply< T1,T2 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3
+
+ >
+struct apply_wrap3
+
+ : F::template apply< T1,T2,T3 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+
+ >
+struct apply_wrap4
+
+ : F::template apply< T1,T2,T3,T4 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+
+ >
+struct apply_wrap5
+
+ : F::template apply< T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename C = na
+ , typename F1 = na
+ , typename F2 = na
+ >
+struct eval_if
+
+
+
+
+
+ : if_<C,F1,F2>::type
+{
+
+
+};
+
+
+
+template<
+ bool C
+ , typename F1
+ , typename F2
+ >
+struct eval_if_c
+
+
+
+
+
+ : if_c<C,F1,F2>::type
+{
+
+};
+
+template<> struct eval_if< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : eval_if< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< eval_if< na , na , na > , Tag > { typedef false_ is_le; typedef eval_if< na , na , na > result_; typedef eval_if< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct has_tag_msvc_sfinae_helper { typedef void type; };template< typename T, typename U = void > struct has_tag_impl_ { static const bool value = false; typedef boost::mpl::bool_<value> type; }; template< typename T > struct has_tag_impl_< T , typename has_tag_msvc_sfinae_helper< typename T::tag >::type > { static const bool value = true; typedef boost::mpl::bool_<value> type; }; template< typename T, typename fallback_ = boost::mpl::bool_<false> > struct has_tag : has_tag_impl_<T> { };
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+template< typename T > struct tag_impl
+{
+ typedef typename T::tag type;
+};
+}
+
+template< typename T, typename Default = void_ > struct tag
+
+ : if_<
+ aux::has_tag<T>
+ , aux::tag_impl<T>
+ , Default
+ >::type
+{
+
+
+
+
+
+
+
+
+
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template<
+ typename F
+ , typename Tag1
+ , typename Tag2
+ >
+struct cast1st_impl
+{
+ template< typename N1, typename N2 > struct apply
+
+ : apply_wrap2<
+ F
+ , typename apply_wrap1< numeric_cast<Tag1,Tag2>,N1 >::type
+ , N2
+ >
+ {
+
+
+
+
+
+
+
+
+ };
+};
+
+template<
+ typename F
+ , typename Tag1
+ , typename Tag2
+ >
+struct cast2nd_impl
+{
+ template< typename N1, typename N2 > struct apply
+
+ : apply_wrap2<
+ F
+ , N1
+ , typename apply_wrap1< numeric_cast<Tag2,Tag1>,N2 >::type
+ >
+ {
+
+
+
+
+
+
+
+
+ };
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename T > struct msvc_eti_base
+ : T
+{
+
+
+
+ typedef T type;
+};
+
+
+
+template<> struct msvc_eti_base<int>
+{
+ typedef msvc_eti_base type;
+ typedef msvc_eti_base first;
+ typedef msvc_eti_base second;
+ typedef msvc_eti_base tag;
+ enum { value = 0 };
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Tag1
+ , typename Tag2
+ >
+struct plus_impl
+ : if_c<
+ ( Tag1::value
+ > Tag2::value
+ )
+
+ , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+ , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+ >::type
+{
+};
+
+
+template<> struct plus_impl< na,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct plus_impl< na,Tag >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct plus_impl< Tag,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename T > struct plus_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N1 = na
+ , typename N2 = na
+ , typename N3 = na, typename N4 = na, typename N5 = na
+ >
+struct plus
+ : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+ typename N1, typename N2, typename N3, typename N4
+ >
+struct plus< N1,N2,N3,N4,na >
+
+ : plus< plus< plus< N1,N2 >, N3>, N4>
+{
+
+};
+
+template<
+ typename N1, typename N2, typename N3
+ >
+struct plus< N1,N2,N3,na,na >
+
+ : plus< plus< N1,N2 >, N3>
+{
+
+};
+
+template<
+ typename N1, typename N2
+ >
+struct plus< N1,N2,na,na,na >
+ : plus_impl<
+ typename plus_tag<N1>::type
+ , typename plus_tag<N2>::type
+ >::template apply< N1,N2 >::type
+{
+
+
+};
+
+template<> struct plus< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : plus< T1 , T2 > { }; }; template< typename Tag > struct lambda< plus< na , na > , Tag > { typedef false_ is_le; typedef plus< na , na > result_; typedef plus< na , na > type; };
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct plus_impl< integral_c_tag,integral_c_tag >
+{
+ template< typename N1, typename N2 > struct apply
+
+ : integral_c<
+ typename aux::largest_int<
+ typename N1::value_type
+ , typename N2::value_type
+ >::type
+ , ( N1::value
+ + N2::value
+ )
+ >
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Tag1
+ , typename Tag2
+ >
+struct minus_impl
+ : if_c<
+ ( Tag1::value
+ > Tag2::value
+ )
+
+ , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >
+ , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >
+ >::type
+{
+};
+
+
+template<> struct minus_impl< na,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct minus_impl< na,Tag >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct minus_impl< Tag,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename T > struct minus_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N1 = na
+ , typename N2 = na
+ , typename N3 = na, typename N4 = na, typename N5 = na
+ >
+struct minus
+ : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+ typename N1, typename N2, typename N3, typename N4
+ >
+struct minus< N1,N2,N3,N4,na >
+
+ : minus< minus< minus< N1,N2 >, N3>, N4>
+{
+
+};
+
+template<
+ typename N1, typename N2, typename N3
+ >
+struct minus< N1,N2,N3,na,na >
+
+ : minus< minus< N1,N2 >, N3>
+{
+
+};
+
+template<
+ typename N1, typename N2
+ >
+struct minus< N1,N2,na,na,na >
+ : minus_impl<
+ typename minus_tag<N1>::type
+ , typename minus_tag<N2>::type
+ >::template apply< N1,N2 >::type
+{
+
+
+};
+
+template<> struct minus< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : minus< T1 , T2 > { }; }; template< typename Tag > struct lambda< minus< na , na > , Tag > { typedef false_ is_le; typedef minus< na , na > result_; typedef minus< na , na > type; };
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct minus_impl< integral_c_tag,integral_c_tag >
+{
+ template< typename N1, typename N2 > struct apply
+
+ : integral_c<
+ typename aux::largest_int<
+ typename N1::value_type
+ , typename N2::value_type
+ >::type
+ , ( N1::value
+ - N2::value
+ )
+ >
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template< typename Tag > struct advance_impl;
+template< typename Iterator, typename N > struct advance;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template< typename Tag > struct distance_impl;
+template< typename First, typename Last > struct distance;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Vector
+ , long n_
+ >
+struct v_iter
+{
+ typedef aux::v_iter_tag tag;
+ typedef random_access_iterator_tag category;
+ typedef typename v_at<Vector,n_>::type type;
+
+ typedef Vector vector_;
+ typedef mpl::long_<n_> pos;
+
+
+
+
+
+
+
+
+
+
+
+
+};
+
+
+
+
+template<
+ typename Vector
+ , long n_
+ >
+struct next< v_iter<Vector,n_> >
+{
+ typedef v_iter<Vector,(n_ + 1)> type;
+};
+
+template<
+ typename Vector
+ , long n_
+ >
+struct prior< v_iter<Vector,n_> >
+{
+ typedef v_iter<Vector,(n_ - 1)> type;
+};
+
+template<
+ typename Vector
+ , long n_
+ , typename Distance
+ >
+struct advance< v_iter<Vector,n_>,Distance>
+{
+ typedef v_iter<
+ Vector
+ , (n_ + Distance::value)
+ > type;
+};
+
+template<
+ typename Vector
+ , long n_
+ , long m_
+ >
+struct distance< v_iter<Vector,n_>, v_iter<Vector,m_> >
+ : mpl::long_<(m_ - n_)>
+{
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Dummy = na > struct vector0;
+
+template<> struct vector0<na>
+{
+
+
+
+
+
+
+
+
+
+ typedef aux::vector_tag<0> tag;
+ typedef vector0 type;
+ typedef void_ item0;
+
+ typedef v_iter<vector0<>,0> begin;
+ typedef v_iter<vector0<>,0> end;
+
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< long N >
+struct clear_impl< aux::vector_tag<N> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector0<> type;
+ };
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct O1_size_impl;
+template< typename Sequence > struct O1_size;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< long N >
+struct O1_size_impl< aux::vector_tag<N> >
+{
+ template< typename Vector > struct apply
+ : mpl::long_<N>
+ {
+ };
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct size_impl;
+template< typename Sequence > struct size;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< long N >
+struct size_impl< aux::vector_tag<N> >
+ : O1_size_impl< aux::vector_tag<N> >
+{
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct empty_impl;
+template< typename Sequence > struct empty;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<>
+struct empty_impl< aux::vector_tag<0> >
+{
+ template< typename Vector > struct apply
+ : true_
+ {
+ };
+};
+
+
+
+template< long N >
+struct empty_impl< aux::vector_tag<N> >
+{
+ template< typename Vector > struct apply
+ : false_
+ {
+ };
+};
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct begin_impl;
+template< typename Tag > struct end_impl;
+
+template< typename Sequence > struct begin;
+template< typename Sequence > struct end;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct nested_begin_end_tag;
+struct non_sequence_tag;
+
+template< typename Sequence > struct sequence_tag;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct has_begin_msvc_sfinae_helper { typedef void type; };template< typename T, typename U = void > struct has_begin_impl_ { static const bool value = false; typedef boost::mpl::bool_<value> type; }; template< typename T > struct has_begin_impl_< T , typename has_begin_msvc_sfinae_helper< typename T::begin >::type > { static const bool value = true; typedef boost::mpl::bool_<value> type; }; template< typename T, typename fallback_ = boost::mpl::bool_<true> > struct has_begin : has_begin_impl_<T> { };
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+namespace aux {
+
+template< typename Sequence >
+struct begin_type
+{
+ typedef typename Sequence::begin type;
+};
+template< typename Sequence >
+struct end_type
+{
+ typedef typename Sequence::end type;
+};
+
+}
+
+
+
+
+
+template< typename Tag >
+struct begin_impl
+{
+ template< typename Sequence > struct apply
+ {
+ typedef typename eval_if<aux::has_begin<Sequence, true_>,
+ aux::begin_type<Sequence>, void_>::type type;
+ };
+};
+
+template< typename Tag >
+struct end_impl
+{
+ template< typename Sequence > struct apply
+ {
+ typedef typename eval_if<aux::has_begin<Sequence, true_>,
+ aux::end_type<Sequence>, void_>::type type;
+ };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct begin_impl<nested_begin_end_tag> { template< typename Sequence > struct apply { typedef typename Sequence::begin type; }; };
+template<> struct end_impl<nested_begin_end_tag> { template< typename Sequence > struct apply { typedef typename Sequence::end type; }; };
+
+
+
+
+template<> struct begin_impl<non_sequence_tag> { template< typename Sequence > struct apply { typedef void_ type; }; };
+template<> struct end_impl<non_sequence_tag> { template< typename Sequence > struct apply { typedef void_ type; }; };
+template<> struct begin_impl<na> { template< typename Sequence > struct apply { typedef void_ type; }; };
+template<> struct end_impl<na> { template< typename Sequence > struct apply { typedef void_ type; }; };
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace aux {
+
+template< bool has_tag_, bool has_begin_ >
+struct sequence_tag_impl
+{
+
+
+ template< typename Sequence > struct result2_;
+};
+
+
+
+
+
+
+
+
+
+
+
+template<> struct sequence_tag_impl<true,true> { template< typename Sequence > struct result2_ { typedef typename Sequence::tag type; }; };
+template<> struct sequence_tag_impl<true,false> { template< typename Sequence > struct result2_ { typedef typename Sequence::tag type; }; };
+template<> struct sequence_tag_impl<false,true> { template< typename Sequence > struct result2_ { typedef nested_begin_end_tag type; }; };
+template<> struct sequence_tag_impl<false,false> { template< typename Sequence > struct result2_ { typedef non_sequence_tag type; }; };
+
+
+
+}
+
+template<
+ typename Sequence = na
+ >
+struct sequence_tag
+ : aux::sequence_tag_impl<
+ ::boost::mpl::aux::has_tag<Sequence>::value
+ , ::boost::mpl::aux::has_begin<Sequence>::value
+ >::template result2_<Sequence>
+{
+};
+
+
+
+template<> struct sequence_tag< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : sequence_tag< T1 > { }; }; template< typename Tag > struct lambda< sequence_tag< na > , Tag > { typedef false_ is_le; typedef sequence_tag< na > result_; typedef sequence_tag< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+template<
+ typename Sequence = na
+ >
+struct begin
+{
+ typedef typename sequence_tag<Sequence>::type tag_;
+ typedef typename begin_impl< tag_ >
+ ::template apply< Sequence >::type type;
+
+
+};
+
+template<
+ typename Sequence = na
+ >
+struct end
+{
+ typedef typename sequence_tag<Sequence>::type tag_;
+ typedef typename end_impl< tag_ >
+ ::template apply< Sequence >::type type;
+
+
+};
+
+template<> struct begin< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : begin< T1 > { }; }; template< typename Tag > struct lambda< begin< na > , Tag > { typedef false_ is_le; typedef begin< na > result_; typedef begin< na > type; };
+template<> struct end< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : end< T1 > { }; }; template< typename Tag > struct lambda< end< na > , Tag > { typedef false_ is_le; typedef end< na > result_; typedef end< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct has_size_msvc_sfinae_helper { typedef void type; };template< typename T, typename U = void > struct has_size_impl_ { static const bool value = false; typedef boost::mpl::bool_<value> type; }; template< typename T > struct has_size_impl_< T , typename has_size_msvc_sfinae_helper< typename T::size >::type > { static const bool value = true; typedef boost::mpl::bool_<value> type; }; template< typename T, typename fallback_ = boost::mpl::bool_<false> > struct has_size : has_size_impl_<T> { };
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+namespace aux {
+template< typename Sequence > struct O1_size_impl
+ : Sequence::size
+{
+};
+}
+
+template< typename Tag >
+struct O1_size_impl
+{
+ template< typename Sequence > struct apply
+
+ : if_<
+ aux::has_size<Sequence>
+ , aux::O1_size_impl<Sequence>
+ , long_<-1>
+ >::type
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+template<
+ typename Sequence = na
+ >
+struct O1_size
+ : O1_size_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >
+{
+
+};
+
+template<> struct O1_size< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : O1_size< T1 > { }; }; template< typename Tag > struct lambda< O1_size< na > , Tag > { typedef false_ is_le; typedef O1_size< na > result_; typedef O1_size< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename F, typename T1 = na, typename T2 = na, typename T3 = na
+ , typename T4 = na, typename T5 = na
+ >
+struct apply;
+
+template<
+ typename F
+ >
+struct apply0;
+
+template<
+ typename F, typename T1
+ >
+struct apply1;
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct apply2;
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct apply3;
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct apply4;
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct apply5;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< int N > struct arg;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< long C_ >
+struct not_impl
+ : bool_<!C_>
+{
+};
+
+}
+
+
+template<
+ typename T = na
+ >
+struct not_
+ : aux::not_impl<
+ T::type::value
+ >
+{
+
+};
+
+template<> struct not_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : not_< T1 > { }; }; template< typename Tag > struct lambda< not_< na > , Tag > { typedef false_ is_le; typedef not_< na > result_; typedef not_< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct failed {};
+
+
+
+
+
+
+
+
+
+
+template< bool C > struct assert { typedef void* type; };
+template<> struct assert<false> { typedef assert type; };
+
+template< bool C >
+int assertion_failed( typename assert<C>::type );
+
+template< bool C >
+struct assertion
+{
+ static int failed( assert<false> );
+};
+
+template<>
+struct assertion<true>
+{
+ static int failed( void* );
+};
+
+struct assert_
+{
+
+ template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};
+
+ static assert_ const arg;
+ enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };
+};
+
+
+
+
+bool operator==( failed, failed );
+bool operator!=( failed, failed );
+bool operator>( failed, failed );
+bool operator>=( failed, failed );
+bool operator<( failed, failed );
+bool operator<=( failed, failed );
+
+
+
+
+
+template< long x, long y, bool (*)(failed, failed) >
+struct assert_relation {};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< bool > struct assert_arg_pred_impl { typedef int type; };
+template<> struct assert_arg_pred_impl<true> { typedef void* type; };
+
+template< typename P > struct assert_arg_pred
+{
+ typedef typename P::type p_type;
+ typedef typename assert_arg_pred_impl< p_type::value >::type type;
+};
+
+template< typename P > struct assert_arg_pred_not
+{
+ typedef typename P::type p_type;
+ static const bool p = !p_type::value;
+ typedef typename assert_arg_pred_impl<p>::type type;
+};
+
+template< typename Pred >
+failed ************ (Pred::************
+ assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )
+ );
+
+template< typename Pred >
+failed ************ (boost::mpl::not_<Pred>::************
+ assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )
+ );
+
+template< typename Pred >
+assert<false>
+assert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );
+
+template< typename Pred >
+assert<false>
+assert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+template<> struct arg< -1 >
+{
+ static const int value = -1;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U1 type;
+ static const std::size_t mpl_assertion_in_line_0 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+template<> struct arg<1>
+{
+ static const int value = 1;
+ typedef arg<2> next;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U1 type;
+ static const std::size_t mpl_assertion_in_line_1 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+template<> struct arg<2>
+{
+ static const int value = 2;
+ typedef arg<3> next;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U2 type;
+ static const std::size_t mpl_assertion_in_line_2 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+template<> struct arg<3>
+{
+ static const int value = 3;
+ typedef arg<4> next;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U3 type;
+ static const std::size_t mpl_assertion_in_line_3 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+template<> struct arg<4>
+{
+ static const int value = 4;
+ typedef arg<5> next;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U4 type;
+ static const std::size_t mpl_assertion_in_line_4 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+template<> struct arg<5>
+{
+ static const int value = 5;
+ typedef arg<6> next;
+
+
+
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ typedef U5 type;
+ static const std::size_t mpl_assertion_in_line_5 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_not_arg( (void (*) (boost::mpl::is_na<type>))0, 1 ) ) );
+ };
+};
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+typedef arg< -1 > _;
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_;
+}
+
+}}
+
+
+
+namespace boost { namespace mpl {
+typedef arg<1> _1;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_1;
+}
+
+}}
+namespace boost { namespace mpl {
+typedef arg<2> _2;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_2;
+}
+
+}}
+namespace boost { namespace mpl {
+typedef arg<3> _3;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_3;
+}
+
+}}
+namespace boost { namespace mpl {
+typedef arg<4> _4;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_4;
+}
+
+}}
+namespace boost { namespace mpl {
+typedef arg<5> _5;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_5;
+}
+
+}}
+namespace boost { namespace mpl {
+typedef arg<6> _6;
+
+}}
+namespace boost { namespace mpl {
+
+
+
+namespace placeholders {
+using boost::mpl::_6;
+}
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename F, typename T1 = na, typename T2 = na, typename T3 = na
+ , typename T4 = na, typename T5 = na
+ >
+struct bind;
+
+template<
+ typename F
+ >
+struct bind0;
+
+template<
+ typename F, typename T1
+ >
+struct bind1;
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct bind2;
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct bind3;
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct bind4;
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct bind5;
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename T = na
+ , int not_le_ = 0
+ >
+struct protect : T
+{
+
+
+
+ typedef protect type;
+
+};
+
+
+
+
+
+
+
+
+
+
+
+template<> struct protect< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : protect< T1 > { }; };
+
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+ typename T, typename U1, typename U2, typename U3, typename U4
+ , typename U5
+ >
+struct resolve_bind_arg
+{
+ typedef T type;
+};
+
+template<
+ typename T
+ , typename Arg
+ >
+struct replace_unnamed_arg
+{
+ typedef Arg next;
+ typedef T type;
+};
+
+template<
+ typename Arg
+ >
+struct replace_unnamed_arg< arg< -1 >, Arg >
+{
+ typedef typename Arg::next next;
+ typedef Arg type;
+};
+
+template<
+ int N, typename U1, typename U2, typename U3, typename U4, typename U5
+ >
+struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >
+{
+ typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename U1, typename U2, typename U3, typename U4
+ , typename U5
+ >
+struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >
+{
+ typedef bind< F,T1,T2,T3,T4,T5 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+template<
+ typename F
+ >
+struct bind0
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ public:
+ typedef typename apply_wrap0<
+ f_
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename U1, typename U2, typename U3, typename U4
+ , typename U5
+ >
+struct resolve_bind_arg<
+ bind0<F>, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind0<F> f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+template<
+ typename F
+ >
+struct bind< F,na,na,na,na,na >
+ : bind0<F>
+{
+};
+
+template<
+ typename F, typename T1
+ >
+struct bind1
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ public:
+ typedef typename apply_wrap1<
+ f_
+ , typename t1::type
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename T1, typename U1, typename U2, typename U3
+ , typename U4, typename U5
+ >
+struct resolve_bind_arg<
+ bind1< F,T1 >, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind1< F,T1 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+template<
+ typename F, typename T1
+ >
+struct bind< F,T1,na,na,na,na >
+ : bind1< F,T1 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct bind2
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ public:
+ typedef typename apply_wrap2<
+ f_
+ , typename t1::type, typename t2::type
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename T1, typename T2, typename U1, typename U2
+ , typename U3, typename U4, typename U5
+ >
+struct resolve_bind_arg<
+ bind2< F,T1,T2 >, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind2< F,T1,T2 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct bind< F,T1,T2,na,na,na >
+ : bind2< F,T1,T2 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct bind3
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ typedef aux::replace_unnamed_arg< T3,n3 > r3;
+ typedef typename r3::type a3;
+ typedef typename r3::next n4;
+ typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+
+ public:
+ typedef typename apply_wrap3<
+ f_
+ , typename t1::type, typename t2::type, typename t3::type
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename U1
+ , typename U2, typename U3, typename U4, typename U5
+ >
+struct resolve_bind_arg<
+ bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind3< F,T1,T2,T3 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct bind< F,T1,T2,T3,na,na >
+ : bind3< F,T1,T2,T3 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct bind4
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ typedef aux::replace_unnamed_arg< T3,n3 > r3;
+ typedef typename r3::type a3;
+ typedef typename r3::next n4;
+ typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+
+ typedef aux::replace_unnamed_arg< T4,n4 > r4;
+ typedef typename r4::type a4;
+ typedef typename r4::next n5;
+ typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+
+ public:
+ typedef typename apply_wrap4<
+ f_
+ , typename t1::type, typename t2::type, typename t3::type
+ , typename t4::type
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename U1, typename U2, typename U3, typename U4, typename U5
+ >
+struct resolve_bind_arg<
+ bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind4< F,T1,T2,T3,T4 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct bind< F,T1,T2,T3,T4,na >
+ : bind4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct bind5
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;
+ typedef typename r0::type a0;
+ typedef typename r0::next n1;
+ typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;
+
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ typedef aux::replace_unnamed_arg< T3,n3 > r3;
+ typedef typename r3::type a3;
+ typedef typename r3::next n4;
+ typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+
+ typedef aux::replace_unnamed_arg< T4,n4 > r4;
+ typedef typename r4::type a4;
+ typedef typename r4::next n5;
+ typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;
+
+ typedef aux::replace_unnamed_arg< T5,n5 > r5;
+ typedef typename r5::type a5;
+ typedef typename r5::next n6;
+ typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;
+
+ public:
+ typedef typename apply_wrap5<
+ f_
+ , typename t1::type, typename t2::type, typename t3::type
+ , typename t4::type, typename t5::type
+ >::type type;
+
+ };
+};
+
+namespace aux {
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename U1, typename U2, typename U3, typename U4
+ , typename U5
+ >
+struct resolve_bind_arg<
+ bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5
+ >
+{
+ typedef bind5< F,T1,T2,T3,T4,T5 > f_;
+ typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;
+};
+
+}
+
+
+
+
+
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct bind
+ : bind5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+
+template< template< typename T1, typename T2, typename T3 > class F, typename Tag >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct if_;
+
+template<
+ typename Tag, typename T1, typename T2, typename T3
+ >
+struct bind3<
+ quote3< if_,Tag >
+ , T1, T2, T3
+ >
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef mpl::arg<1> n1;
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ typedef aux::replace_unnamed_arg< T3,n3 > r3;
+ typedef typename r3::type a3;
+ typedef typename r3::next n4;
+ typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+
+ typedef typename if_<
+ typename t1::type
+ , t2, t3
+ >::type f_;
+
+ public:
+ typedef typename f_::type type;
+ };
+};
+
+template<
+ template< typename T1, typename T2, typename T3 > class F, typename Tag
+ >
+struct quote3;
+
+template< typename T1, typename T2, typename T3 > struct eval_if;
+
+template<
+ typename Tag, typename T1, typename T2, typename T3
+ >
+struct bind3<
+ quote3< eval_if,Tag >
+ , T1, T2, T3
+ >
+{
+ template<
+ typename U1 = na, typename U2 = na, typename U3 = na
+ , typename U4 = na, typename U5 = na
+ >
+ struct apply
+ {
+ private:
+ typedef mpl::arg<1> n1;
+ typedef aux::replace_unnamed_arg< T1,n1 > r1;
+ typedef typename r1::type a1;
+ typedef typename r1::next n2;
+ typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;
+
+ typedef aux::replace_unnamed_arg< T2,n2 > r2;
+ typedef typename r2::type a2;
+ typedef typename r2::next n3;
+ typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;
+
+ typedef aux::replace_unnamed_arg< T3,n3 > r3;
+ typedef typename r3::type a3;
+ typedef typename r3::next n4;
+ typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;
+
+ typedef typename eval_if<
+ typename t1::type
+ , t2, t3
+ >::type f_;
+
+ public:
+ typedef typename f_::type type;
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct has_type_msvc_sfinae_helper { typedef void type; };template< typename T, typename U = void > struct has_type_impl_ { static const bool value = false; typedef boost::mpl::bool_<value> type; }; template< typename T > struct has_type_impl_< T , typename has_type_msvc_sfinae_helper< typename T::type >::type > { static const bool value = true; typedef boost::mpl::bool_<value> type; }; template< typename T, typename fallback_ = boost::mpl::bool_<true> > struct has_type : has_type_impl_<T> { };
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename T, bool has_type_ >
+struct quote_impl
+ : T
+{
+};
+
+template< typename T >
+struct quote_impl< T,false >
+{
+ typedef T type;
+};
+
+template<
+ template< typename P1 > class F
+ , typename Tag = void_
+ >
+struct quote1
+{
+ template< typename U1 > struct apply
+
+ : quote_impl<
+ F<U1>
+ , aux::has_type< F<U1> >::value
+ >
+
+ {
+ };
+};
+
+template<
+ template< typename P1, typename P2 > class F
+ , typename Tag = void_
+ >
+struct quote2
+{
+ template< typename U1, typename U2 > struct apply
+
+ : quote_impl<
+ F< U1,U2 >
+ , aux::has_type< F< U1,U2 > >::value
+ >
+
+ {
+ };
+};
+
+template<
+ template< typename P1, typename P2, typename P3 > class F
+ , typename Tag = void_
+ >
+struct quote3
+{
+ template< typename U1, typename U2, typename U3 > struct apply
+
+ : quote_impl<
+ F< U1,U2,U3 >
+ , aux::has_type< F< U1,U2,U3 > >::value
+ >
+
+ {
+ };
+};
+
+template<
+ template< typename P1, typename P2, typename P3, typename P4 > class F
+ , typename Tag = void_
+ >
+struct quote4
+{
+ template<
+ typename U1, typename U2, typename U3, typename U4
+ >
+ struct apply
+
+ : quote_impl<
+ F< U1,U2,U3,U4 >
+ , aux::has_type< F< U1,U2,U3,U4 > >::value
+ >
+
+ {
+ };
+};
+
+template<
+ template<
+ typename P1, typename P2, typename P3, typename P4
+ , typename P5
+ >
+ class F
+ , typename Tag = void_
+ >
+struct quote5
+{
+ template<
+ typename U1, typename U2, typename U3, typename U4
+ , typename U5
+ >
+ struct apply
+
+ : quote_impl<
+ F< U1,U2,U3,U4,U5 >
+ , aux::has_type< F< U1,U2,U3,U4,U5 > >::value
+ >
+
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+ bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false
+ , bool C5 = false
+ >
+struct lambda_or
+ : true_
+{
+};
+
+template<>
+struct lambda_or< false,false,false,false,false >
+ : false_
+{
+};
+
+}
+
+template<
+ typename T
+ , typename Tag
+
+ >
+struct lambda
+{
+ typedef false_ is_le;
+ typedef T result_;
+ typedef T type;
+};
+
+template<
+ typename T
+ >
+struct is_lambda_expression
+ : lambda<T>::is_le
+{
+};
+
+template< int N, typename Tag >
+struct lambda< arg<N>, Tag >
+{
+ typedef true_ is_le;
+ typedef mpl::arg<N> result_;
+ typedef mpl::protect<result_> type;
+};
+
+template<
+ typename F
+ , typename Tag
+ >
+struct lambda<
+ bind0<F>
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind0<
+ F
+ > result_;
+
+ typedef result_ type;
+};
+
+namespace aux {
+
+template<
+ typename IsLE, typename Tag
+ , template< typename P1 > class F
+ , typename L1
+ >
+struct le_result1
+{
+ typedef F<
+ typename L1::type
+ > result_;
+
+ typedef result_ type;
+};
+
+template<
+ typename Tag
+ , template< typename P1 > class F
+ , typename L1
+ >
+struct le_result1< true_,Tag,F,L1 >
+{
+ typedef bind1<
+ quote1< F,Tag >
+ , typename L1::result_
+ > result_;
+
+ typedef mpl::protect<result_> type;
+};
+
+}
+
+template<
+ template< typename P1 > class F
+ , typename T1
+ , typename Tag
+ >
+struct lambda<
+ F<T1>
+ , Tag
+
+ >
+{
+ typedef lambda< T1,Tag > l1;
+ typedef typename l1::is_le is_le1;
+ typedef typename aux::lambda_or<
+ is_le1::value
+ >::type is_le;
+
+ typedef aux::le_result1<
+ is_le, Tag, F, l1
+ > le_result_;
+
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<
+ typename F, typename T1
+ , typename Tag
+ >
+struct lambda<
+ bind1< F,T1 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind1<
+ F
+ , T1
+ > result_;
+
+ typedef result_ type;
+};
+
+namespace aux {
+
+template<
+ typename IsLE, typename Tag
+ , template< typename P1, typename P2 > class F
+ , typename L1, typename L2
+ >
+struct le_result2
+{
+ typedef F<
+ typename L1::type, typename L2::type
+ > result_;
+
+ typedef result_ type;
+};
+
+template<
+ typename Tag
+ , template< typename P1, typename P2 > class F
+ , typename L1, typename L2
+ >
+struct le_result2< true_,Tag,F,L1,L2 >
+{
+ typedef bind2<
+ quote2< F,Tag >
+ , typename L1::result_, typename L2::result_
+ > result_;
+
+ typedef mpl::protect<result_> type;
+};
+
+}
+
+template<
+ template< typename P1, typename P2 > class F
+ , typename T1, typename T2
+ , typename Tag
+ >
+struct lambda<
+ F< T1,T2 >
+ , Tag
+
+ >
+{
+ typedef lambda< T1,Tag > l1;
+ typedef lambda< T2,Tag > l2;
+
+ typedef typename l1::is_le is_le1;
+ typedef typename l2::is_le is_le2;
+
+
+ typedef typename aux::lambda_or<
+ is_le1::value, is_le2::value
+ >::type is_le;
+
+ typedef aux::le_result2<
+ is_le, Tag, F, l1, l2
+ > le_result_;
+
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<
+ typename F, typename T1, typename T2
+ , typename Tag
+ >
+struct lambda<
+ bind2< F,T1,T2 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind2<
+ F
+ , T1, T2
+ > result_;
+
+ typedef result_ type;
+};
+
+namespace aux {
+
+template<
+ typename IsLE, typename Tag
+ , template< typename P1, typename P2, typename P3 > class F
+ , typename L1, typename L2, typename L3
+ >
+struct le_result3
+{
+ typedef F<
+ typename L1::type, typename L2::type, typename L3::type
+ > result_;
+
+ typedef result_ type;
+};
+
+template<
+ typename Tag
+ , template< typename P1, typename P2, typename P3 > class F
+ , typename L1, typename L2, typename L3
+ >
+struct le_result3< true_,Tag,F,L1,L2,L3 >
+{
+ typedef bind3<
+ quote3< F,Tag >
+ , typename L1::result_, typename L2::result_, typename L3::result_
+ > result_;
+
+ typedef mpl::protect<result_> type;
+};
+
+}
+
+template<
+ template< typename P1, typename P2, typename P3 > class F
+ , typename T1, typename T2, typename T3
+ , typename Tag
+ >
+struct lambda<
+ F< T1,T2,T3 >
+ , Tag
+
+ >
+{
+ typedef lambda< T1,Tag > l1;
+ typedef lambda< T2,Tag > l2;
+ typedef lambda< T3,Tag > l3;
+
+ typedef typename l1::is_le is_le1;
+ typedef typename l2::is_le is_le2;
+ typedef typename l3::is_le is_le3;
+
+
+ typedef typename aux::lambda_or<
+ is_le1::value, is_le2::value, is_le3::value
+ >::type is_le;
+
+ typedef aux::le_result3<
+ is_le, Tag, F, l1, l2, l3
+ > le_result_;
+
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ , typename Tag
+ >
+struct lambda<
+ bind3< F,T1,T2,T3 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind3<
+ F
+ , T1, T2, T3
+ > result_;
+
+ typedef result_ type;
+};
+
+namespace aux {
+
+template<
+ typename IsLE, typename Tag
+ , template< typename P1, typename P2, typename P3, typename P4 > class F
+ , typename L1, typename L2, typename L3, typename L4
+ >
+struct le_result4
+{
+ typedef F<
+ typename L1::type, typename L2::type, typename L3::type
+ , typename L4::type
+ > result_;
+
+ typedef result_ type;
+};
+
+template<
+ typename Tag
+ , template< typename P1, typename P2, typename P3, typename P4 > class F
+ , typename L1, typename L2, typename L3, typename L4
+ >
+struct le_result4< true_,Tag,F,L1,L2,L3,L4 >
+{
+ typedef bind4<
+ quote4< F,Tag >
+ , typename L1::result_, typename L2::result_, typename L3::result_
+ , typename L4::result_
+ > result_;
+
+ typedef mpl::protect<result_> type;
+};
+
+}
+
+template<
+ template< typename P1, typename P2, typename P3, typename P4 > class F
+ , typename T1, typename T2, typename T3, typename T4
+ , typename Tag
+ >
+struct lambda<
+ F< T1,T2,T3,T4 >
+ , Tag
+
+ >
+{
+ typedef lambda< T1,Tag > l1;
+ typedef lambda< T2,Tag > l2;
+ typedef lambda< T3,Tag > l3;
+ typedef lambda< T4,Tag > l4;
+
+ typedef typename l1::is_le is_le1;
+ typedef typename l2::is_le is_le2;
+ typedef typename l3::is_le is_le3;
+ typedef typename l4::is_le is_le4;
+
+
+ typedef typename aux::lambda_or<
+ is_le1::value, is_le2::value, is_le3::value, is_le4::value
+ >::type is_le;
+
+ typedef aux::le_result4<
+ is_le, Tag, F, l1, l2, l3, l4
+ > le_result_;
+
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename Tag
+ >
+struct lambda<
+ bind4< F,T1,T2,T3,T4 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind4<
+ F
+ , T1, T2, T3, T4
+ > result_;
+
+ typedef result_ type;
+};
+
+namespace aux {
+
+template<
+ typename IsLE, typename Tag
+ , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+ , typename L1, typename L2, typename L3, typename L4, typename L5
+ >
+struct le_result5
+{
+ typedef F<
+ typename L1::type, typename L2::type, typename L3::type
+ , typename L4::type, typename L5::type
+ > result_;
+
+ typedef result_ type;
+};
+
+template<
+ typename Tag
+ , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F
+ , typename L1, typename L2, typename L3, typename L4, typename L5
+ >
+struct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >
+{
+ typedef bind5<
+ quote5< F,Tag >
+ , typename L1::result_, typename L2::result_, typename L3::result_
+ , typename L4::result_, typename L5::result_
+ > result_;
+
+ typedef mpl::protect<result_> type;
+};
+
+}
+
+template<
+ template<
+ typename P1, typename P2, typename P3, typename P4
+ , typename P5
+ >
+ class F
+ , typename T1, typename T2, typename T3, typename T4, typename T5
+ , typename Tag
+ >
+struct lambda<
+ F< T1,T2,T3,T4,T5 >
+ , Tag
+
+ >
+{
+ typedef lambda< T1,Tag > l1;
+ typedef lambda< T2,Tag > l2;
+ typedef lambda< T3,Tag > l3;
+ typedef lambda< T4,Tag > l4;
+ typedef lambda< T5,Tag > l5;
+
+ typedef typename l1::is_le is_le1;
+ typedef typename l2::is_le is_le2;
+ typedef typename l3::is_le is_le3;
+ typedef typename l4::is_le is_le4;
+ typedef typename l5::is_le is_le5;
+
+
+ typedef typename aux::lambda_or<
+ is_le1::value, is_le2::value, is_le3::value, is_le4::value
+ , is_le5::value
+ >::type is_le;
+
+ typedef aux::le_result5<
+ is_le, Tag, F, l1, l2, l3, l4, l5
+ > le_result_;
+
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ , typename Tag
+ >
+struct lambda<
+ bind5< F,T1,T2,T3,T4,T5 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind5<
+ F
+ , T1, T2, T3, T4, T5
+ > result_;
+
+ typedef result_ type;
+};
+
+
+template< typename T, typename Tag >
+struct lambda< mpl::protect<T>, Tag >
+{
+ typedef false_ is_le;
+ typedef mpl::protect<T> result_;
+ typedef result_ type;
+};
+
+
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ , typename Tag
+ >
+struct lambda<
+ bind< F,T1,T2,T3,T4,T5 >
+ , Tag
+
+ >
+{
+ typedef false_ is_le;
+ typedef bind< F,T1,T2,T3,T4,T5 > result_;
+ typedef result_ type;
+};
+
+
+
+template<
+ typename F, typename Tag1, typename Tag2
+ >
+struct lambda<
+ lambda< F,Tag1 >
+ , Tag2
+ >
+{
+ typedef lambda< F,Tag2 > l1;
+ typedef lambda< Tag1,Tag2 > l2;
+ typedef typename l1::is_le is_le;
+ typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;
+ typedef typename le_result_::result_ result_;
+ typedef typename le_result_::type type;
+};
+
+template<> struct lambda< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : lambda< T1 , T2 > { }; }; template< typename Tag > struct lambda< lambda< na , na > , Tag > { typedef false_ is_le; typedef lambda< na , na > result_; typedef lambda< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename F
+ >
+struct apply0
+
+ : apply_wrap0<
+ typename lambda<F>::type
+
+ >
+{
+};
+
+template<
+ typename F
+ >
+struct apply< F,na,na,na,na,na >
+ : apply0<F>
+{
+};
+
+template<
+ typename F, typename T1
+ >
+struct apply1
+
+ : apply_wrap1<
+ typename lambda<F>::type
+ , T1
+ >
+{
+};
+
+template<
+ typename F, typename T1
+ >
+struct apply< F,T1,na,na,na,na >
+ : apply1< F,T1 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct apply2
+
+ : apply_wrap2<
+ typename lambda<F>::type
+ , T1, T2
+ >
+{
+};
+
+template<
+ typename F, typename T1, typename T2
+ >
+struct apply< F,T1,T2,na,na,na >
+ : apply2< F,T1,T2 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct apply3
+
+ : apply_wrap3<
+ typename lambda<F>::type
+ , T1, T2, T3
+ >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3
+ >
+struct apply< F,T1,T2,T3,na,na >
+ : apply3< F,T1,T2,T3 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct apply4
+
+ : apply_wrap4<
+ typename lambda<F>::type
+ , T1, T2, T3, T4
+ >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ >
+struct apply< F,T1,T2,T3,T4,na >
+ : apply4< F,T1,T2,T3,T4 >
+{
+};
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct apply5
+
+ : apply_wrap5<
+ typename lambda<F>::type
+ , T1, T2, T3, T4, T5
+ >
+{
+};
+
+
+
+template<
+ typename F, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct apply
+ : apply5< F,T1,T2,T3,T4,T5 >
+{
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename T > struct msvc_type
+{
+ typedef typename T::type type;
+};
+
+template<> struct msvc_type<int>
+{
+ typedef int type;
+};
+
+
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Iterator = na
+ >
+struct deref
+{
+
+ typedef typename Iterator::type type;
+
+
+
+
+};
+
+template<> struct deref< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : deref< T1 > { }; }; template< typename Tag > struct lambda< deref< na > , Tag > { typedef false_ is_le; typedef deref< na > result_; typedef deref< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+template<
+ int N
+ , typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl;
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< 0,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef state0 state;
+ typedef iter0 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< 1,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+
+
+ typedef state1 state;
+ typedef iter1 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< 2,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+
+
+ typedef state2 state;
+ typedef iter2 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< 3,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+ typedef typename mpl::next<iter2>::type iter3;
+
+
+ typedef state3 state;
+ typedef iter3 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< 4,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;
+ typedef typename mpl::next<iter2>::type iter3;
+ typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;
+ typedef typename mpl::next<iter3>::type iter4;
+
+
+ typedef state4 state;
+ typedef iter4 iterator;
+};
+
+template<
+ int N
+ , typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl
+{
+ typedef fold_impl<
+ 4
+ , First
+ , Last
+ , State
+ , ForwardOp
+ > chunk_;
+
+ typedef fold_impl<
+ ( (N - 4) < 0 ? 0 : N - 4 )
+ , typename chunk_::iterator
+ , Last
+ , typename chunk_::state
+ , ForwardOp
+ > res_;
+
+ typedef typename res_::state state;
+ typedef typename res_::iterator iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< -1,First,Last,State,ForwardOp >
+ : fold_impl<
+ -1
+ , typename mpl::next<First>::type
+ , Last
+ , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+ , ForwardOp
+ >
+{
+};
+
+template<
+ typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct fold_impl< -1,Last,Last,State,ForwardOp >
+{
+ typedef State state;
+ typedef Last iterator;
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename State = na
+ , typename ForwardOp = na
+ >
+struct fold
+{
+ typedef typename aux::fold_impl<
+ ::boost::mpl::O1_size<Sequence>::value
+ , typename begin<Sequence>::type
+ , typename end<Sequence>::type
+ , State
+ , ForwardOp
+ >::state type;
+
+
+};
+
+template<> struct fold< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : fold< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< fold< na , na , na > , Tag > { typedef false_ is_le; typedef fold< na , na , na > result_; typedef fold< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+template<
+ long N
+ , typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl;
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef fwd_state0 bkwd_state0;
+ typedef bkwd_state0 state;
+ typedef iter0 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+ typedef typename mpl::next<iter0>::type iter1;
+
+
+ typedef fwd_state1 bkwd_state1;
+ typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+ typedef bkwd_state0 state;
+ typedef iter1 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+ typedef typename mpl::next<iter1>::type iter2;
+
+
+ typedef fwd_state2 bkwd_state2;
+ typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+ typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+
+
+ typedef bkwd_state0 state;
+ typedef iter2 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+ typedef typename mpl::next<iter2>::type iter3;
+
+
+ typedef fwd_state3 bkwd_state3;
+ typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+ typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+ typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+
+
+ typedef bkwd_state0 state;
+ typedef iter3 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+ typedef typename mpl::next<iter2>::type iter3;
+ typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+ typedef typename mpl::next<iter3>::type iter4;
+
+
+ typedef fwd_state4 bkwd_state4;
+ typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+ typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+ typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+ typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+
+
+ typedef bkwd_state0 state;
+ typedef iter4 iterator;
+};
+
+template<
+ long N
+ , typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl
+{
+ typedef First iter0;
+ typedef State fwd_state0;
+ typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;
+ typedef typename mpl::next<iter2>::type iter3;
+ typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;
+ typedef typename mpl::next<iter3>::type iter4;
+
+
+ typedef reverse_fold_impl<
+ ( (N - 4) < 0 ? 0 : N - 4 )
+ , iter4
+ , Last
+ , fwd_state4
+ , BackwardOp
+ , ForwardOp
+ > nested_chunk;
+
+ typedef typename nested_chunk::state bkwd_state4;
+ typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;
+ typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;
+ typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;
+ typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;
+
+
+ typedef bkwd_state0 state;
+ typedef typename nested_chunk::iterator iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >
+{
+ typedef reverse_fold_impl<
+ -1
+ , typename mpl::next<First>::type
+ , Last
+ , typename apply2<ForwardOp,State, typename deref<First>::type>::type
+ , BackwardOp
+ , ForwardOp
+ > nested_step;
+
+ typedef typename apply2<
+ BackwardOp
+ , typename nested_step::state
+ , typename deref<First>::type
+ >::type state;
+
+ typedef typename nested_step::iterator iterator;
+};
+
+template<
+ typename Last
+ , typename State
+ , typename BackwardOp
+ , typename ForwardOp
+ >
+struct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >
+{
+ typedef State state;
+ typedef Last iterator;
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename State = na
+ , typename BackwardOp = na
+ , typename ForwardOp = arg<1>
+ >
+struct reverse_fold
+{
+ typedef typename aux::reverse_fold_impl<
+ ::boost::mpl::O1_size<Sequence>::value
+ , typename begin<Sequence>::type
+ , typename end<Sequence>::type
+ , State
+ , BackwardOp
+ , ForwardOp
+ >::state type;
+
+
+};
+
+template<> struct reverse_fold< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : reverse_fold< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< reverse_fold< na , na , na > , Tag > { typedef false_ is_le; typedef reverse_fold< na , na , na > result_; typedef reverse_fold< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename T = na
+ >
+struct identity
+{
+ typedef T type;
+
+};
+
+template<
+ typename T = na
+ >
+struct make_identity
+{
+ typedef identity<T> type;
+
+};
+
+template<> struct identity< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : identity< T1 > { }; }; template< typename Tag > struct lambda< identity< na > , Tag > { typedef false_ is_le; typedef identity< na > result_; typedef identity< na > type; };
+template<> struct make_identity< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : make_identity< T1 > { }; }; template< typename Tag > struct lambda< make_identity< na > , Tag > { typedef false_ is_le; typedef make_identity< na > result_; typedef make_identity< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct has_push_back_arg {};
+
+
+
+template< typename Tag >
+struct push_back_impl
+{
+ template< typename Sequence, typename T > struct apply
+ {
+
+
+
+ struct REQUESTED_PUSH_BACK_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST; typedef struct REQUESTED_PUSH_BACK_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST6 : boost::mpl::assert_ { static boost::mpl::failed ************ (REQUESTED_PUSH_BACK_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST::************ assert_arg()) ( Sequence ) { return 0; } } mpl_assert_arg6; static const std::size_t mpl_assertion_in_line_6 = sizeof( boost::mpl::assertion_failed<(( boost::is_same< T, has_push_back_arg >::value ))>( mpl_assert_arg6::assert_arg() ) );
+ };
+};
+
+template< typename Tag >
+struct has_push_back_impl
+{
+ template< typename Seq > struct apply
+
+ : aux::has_type< push_back< Seq, has_push_back_arg > >
+ {
+
+
+
+
+
+
+
+ };
+};
+
+ template<> struct push_back_impl<non_sequence_tag> {};
+ template<> struct has_push_back_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename T = na
+ >
+struct push_back
+ : push_back_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence,T >
+{
+
+};
+
+
+template<
+ typename Sequence = na
+ >
+struct has_push_back
+ : has_push_back_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >
+{
+
+};
+
+
+template<> struct push_back< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : push_back< T1 , T2 > { }; }; template< typename Tag > struct lambda< push_back< na , na > , Tag > { typedef false_ is_le; typedef push_back< na , na > result_; typedef push_back< na , na > type; };
+template<> struct has_push_back< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : has_push_back< T1 > { }; }; template< typename Tag > struct lambda< has_push_back< na > , Tag > { typedef false_ is_le; typedef has_push_back< na > result_; typedef has_push_back< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence
+ , typename Operation
+ >
+struct inserter
+{
+ typedef Sequence state;
+ typedef Operation operation;
+};
+
+}}
+
+
+
+
+namespace boost {
+namespace mpl {
+
+template<
+ typename Sequence
+ >
+struct back_inserter
+ : inserter< Sequence,push_back<> >
+{
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct has_push_front_arg {};
+
+
+
+
+template< typename Tag >
+struct push_front_impl
+{
+ template< typename Sequence, typename T > struct apply
+ {
+
+
+
+ struct REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST; typedef struct REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST7 : boost::mpl::assert_ { static boost::mpl::failed ************ (REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST::************ assert_arg()) ( Sequence ) { return 0; } } mpl_assert_arg7; static const std::size_t mpl_assertion_in_line_7 = sizeof( boost::mpl::assertion_failed<(( boost::is_same< T, has_push_front_arg >::value ))>( mpl_assert_arg7::assert_arg() ) );
+ };
+};
+
+template< typename Tag >
+struct has_push_front_impl
+{
+ template< typename Seq > struct apply
+
+ : aux::has_type< push_front< Seq, has_push_front_arg > >
+ {
+
+
+
+
+
+
+
+ };
+};
+
+ template<> struct push_front_impl<non_sequence_tag> {};
+ template<> struct has_push_front_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename T = na
+ >
+struct push_front
+ : push_front_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence,T >
+{
+
+};
+
+
+template<
+ typename Sequence = na
+ >
+struct has_push_front
+ : has_push_front_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >
+{
+
+};
+
+template<> struct push_front< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : push_front< T1 , T2 > { }; }; template< typename Tag > struct lambda< push_front< na , na > , Tag > { typedef false_ is_le; typedef push_front< na , na > result_; typedef push_front< na , na > type; };
+template<> struct has_push_front< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : has_push_front< T1 > { }; }; template< typename Tag > struct lambda< has_push_front< na > , Tag > { typedef false_ is_le; typedef has_push_front< na > result_; typedef has_push_front< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence
+ >
+struct front_inserter
+ : inserter< Sequence,push_front<> >
+{
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template< typename Tag >
+struct clear_impl
+{
+ template< typename Sequence > struct apply;
+};
+
+ template<> struct clear_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ >
+struct clear
+ : clear_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >
+{
+
+};
+
+template<> struct clear< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : clear< T1 > { }; }; template< typename Tag > struct lambda< clear< na > , Tag > { typedef false_ is_le; typedef clear< na > result_; typedef clear< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< typename Pred, typename InsertOp > struct remove_if_helper
+{
+ template< typename Sequence, typename U > struct apply
+ {
+ typedef typename eval_if<
+ typename apply1<Pred,U>::type
+ , identity<Sequence>
+ , apply2<InsertOp,Sequence,U>
+ >::type type;
+ };
+};
+
+template<
+ typename Sequence
+ , typename Predicate
+ , typename Inserter
+ >
+struct remove_if_impl
+ : fold<
+ Sequence
+ , typename Inserter::state
+ , protect< aux::remove_if_helper<
+ typename lambda<Predicate>::type
+ , typename Inserter::operation
+ > >
+ >
+{
+};
+
+template<
+ typename Sequence
+ , typename Predicate
+ , typename Inserter
+ >
+struct reverse_remove_if_impl
+ : reverse_fold<
+ Sequence
+ , typename Inserter::state
+ , protect< aux::remove_if_helper<
+ typename lambda<Predicate>::type
+ , typename Inserter::operation
+ > >
+ >
+{
+};
+
+}
+
+ template< typename P1 = na , typename P2 = na , typename P3 = na > struct remove_if : aux::remove_if_impl< P1 , P2 , P3> { }; template< typename P1 , typename P2 > struct remove_if< P1 , P2,na > : if_< has_push_back< typename clear<P1>::type> , aux::remove_if_impl< P1 , P2 , back_inserter< typename clear<P1>::type > > , aux::reverse_remove_if_impl< P1 , P2 , front_inserter< typename clear<P1>::type > > >::type { }; template< typename P1 = na , typename P2 = na , typename P3 = na > struct reverse_remove_if : aux::reverse_remove_if_impl< P1 , P2 , P3> { }; template< typename P1 , typename P2 > struct reverse_remove_if< P1 , P2,na > : if_< has_push_back<P1> , aux::reverse_remove_if_impl< P1 , P2 , back_inserter< typename clear<P1>::type > > , aux::remove_if_impl< P1 , P2 , front_inserter< typename clear<P1>::type > > >::type { }; template<> struct remove_if< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : remove_if< T1 , T2
 , T3 > { }; }; template< typename Tag > struct lambda< remove_if< na , na , na > , Tag > { typedef false_ is_le; typedef remove_if< na , na , na > result_; typedef remove_if< na , na , na > type; }; template<> struct reverse_remove_if< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : reverse_remove_if< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< reverse_remove_if< na , na , na > , Tag > { typedef false_ is_le; typedef reverse_remove_if< na , na , na > result_; typedef reverse_remove_if< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename T1 >
+struct same_as
+{
+ template< typename T2 > struct apply
+
+ : is_same<T1,T2>
+ {
+
+
+
+
+ };
+};
+
+template< typename T1 >
+struct not_same_as
+{
+ template< typename T2 > struct apply
+
+ : not_< is_same<T1,T2> >
+ {
+
+
+
+
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template<
+ typename Sequence
+ , typename T
+ , typename Inserter
+ >
+struct remove_impl
+ : remove_if_impl< Sequence, same_as<T>, Inserter >
+{
+};
+
+template<
+ typename Sequence
+ , typename T
+ , typename Inserter
+ >
+struct reverse_remove_impl
+ : reverse_remove_if_impl< Sequence, same_as<T>, Inserter >
+{
+};
+
+}
+
+ template< typename P1 = na , typename P2 = na , typename P3 = na > struct remove : aux::remove_impl< P1 , P2 , P3> { }; template< typename P1 , typename P2 > struct remove< P1 , P2,na > : if_< has_push_back< typename clear<P1>::type> , aux::remove_impl< P1 , P2 , back_inserter< typename clear<P1>::type > > , aux::reverse_remove_impl< P1 , P2 , front_inserter< typename clear<P1>::type > > >::type { }; template< typename P1 = na , typename P2 = na , typename P3 = na > struct reverse_remove : aux::reverse_remove_impl< P1 , P2 , P3> { }; template< typename P1 , typename P2 > struct reverse_remove< P1 , P2,na > : if_< has_push_back<P1> , aux::reverse_remove_impl< P1 , P2 , back_inserter< typename clear<P1>::type > > , aux::remove_impl< P1 , P2 , front_inserter< typename clear<P1>::type > > >::type { }; template<> struct remove< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : remove< T1 , T2 , T3 > { }; }; template< typename T
ag > struct lambda< remove< na , na , na > , Tag > { typedef false_ is_le; typedef remove< na , na , na > result_; typedef remove< na , na , na > type; }; template<> struct reverse_remove< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : reverse_remove< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< reverse_remove< na , na , na > , Tag > { typedef false_ is_le; typedef reverse_remove< na , na , na > result_; typedef reverse_remove< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename V >
+struct v_at< V,0 >
+{
+ typedef typename V::item0 type;
+};
+
+template<
+ typename T0
+ >
+struct vector1
+{
+ typedef aux::vector_tag<1> tag;
+ typedef vector1 type;
+ typedef T0 item0;
+ typedef void_ item1;
+ typedef T0 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,1 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<0> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector1<
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<1> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector0<
+
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<0> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector1<
+
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<1> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector0<
+
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,1 >
+{
+ typedef typename V::item1 type;
+};
+
+template<
+ typename T0, typename T1
+ >
+struct vector2
+{
+ typedef aux::vector_tag<2> tag;
+ typedef vector2 type;
+ typedef T0 item0;
+ typedef T1 item1;
+
+
+ typedef void_ item2;
+ typedef T1 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,2 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<1> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector2<
+ T
+ ,
+ typename Vector::item0
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<2> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector1<
+ typename Vector::item1
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<1> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector2<
+ typename Vector::item0
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<2> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector1<
+ typename Vector::item0
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,2 >
+{
+ typedef typename V::item2 type;
+};
+
+template<
+ typename T0, typename T1, typename T2
+ >
+struct vector3
+{
+ typedef aux::vector_tag<3> tag;
+ typedef vector3 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+
+
+ typedef void_ item3;
+ typedef T2 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,3 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<2> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector3<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<3> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector2<
+ typename Vector::item1, typename Vector::item2
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<2> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector3<
+ typename Vector::item0, typename Vector::item1
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<3> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector2<
+ typename Vector::item0, typename Vector::item1
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,3 >
+{
+ typedef typename V::item3 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3
+ >
+struct vector4
+{
+ typedef aux::vector_tag<4> tag;
+ typedef vector4 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+
+
+ typedef void_ item4;
+ typedef T3 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,4 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<3> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector4<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<4> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector3<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<3> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector4<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<4> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector3<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,4 >
+{
+ typedef typename V::item4 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ >
+struct vector5
+{
+ typedef aux::vector_tag<5> tag;
+ typedef vector5 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+
+
+ typedef void_ item5;
+ typedef T4 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,5 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<4> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector5<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<5> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector4<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<4> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector5<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<5> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector4<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,5 >
+{
+ typedef typename V::item5 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5
+ >
+struct vector6
+{
+ typedef aux::vector_tag<6> tag;
+ typedef vector6 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+
+
+ typedef void_ item6;
+ typedef T5 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,6 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<5> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector6<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<6> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector5<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<5> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector6<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<6> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector5<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,6 >
+{
+ typedef typename V::item6 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6
+ >
+struct vector7
+{
+ typedef aux::vector_tag<7> tag;
+ typedef vector7 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+
+
+ typedef void_ item7;
+ typedef T6 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,7 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<6> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector7<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<7> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector6<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<6> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector7<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<7> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector6<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,7 >
+{
+ typedef typename V::item7 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7
+ >
+struct vector8
+{
+ typedef aux::vector_tag<8> tag;
+ typedef vector8 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+
+
+ typedef void_ item8;
+ typedef T7 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,8 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<7> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector8<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<8> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector7<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<7> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector8<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<8> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector7<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,8 >
+{
+ typedef typename V::item8 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8
+ >
+struct vector9
+{
+ typedef aux::vector_tag<9> tag;
+ typedef vector9 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+
+
+ typedef void_ item9;
+ typedef T8 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,9 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<8> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector9<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<9> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector8<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<8> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector9<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<9> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector8<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,9 >
+{
+ typedef typename V::item9 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ >
+struct vector10
+{
+ typedef aux::vector_tag<10> tag;
+ typedef vector10 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+
+
+ typedef void_ item10;
+ typedef T9 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,10 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<9> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector10<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<10> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector9<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<9> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector10<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<10> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector9<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,10 >
+{
+ typedef typename V::item10 type;
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10
+ >
+struct vector11
+{
+ typedef aux::vector_tag<11> tag;
+ typedef vector11 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+
+
+ typedef void_ item11;
+ typedef T10 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,11 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<10> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector11<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<11> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector10<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<10> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector11<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<11> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector10<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,11 >
+{
+ typedef typename V::item11 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11
+ >
+struct vector12
+{
+ typedef aux::vector_tag<12> tag;
+ typedef vector12 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+
+
+ typedef void_ item12;
+ typedef T11 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,12 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<11> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector12<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<12> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector11<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<11> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector12<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<12> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector11<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,12 >
+{
+ typedef typename V::item12 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12
+ >
+struct vector13
+{
+ typedef aux::vector_tag<13> tag;
+ typedef vector13 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+
+
+ typedef void_ item13;
+ typedef T12 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,13 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<12> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector13<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<13> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector12<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<12> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector13<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<13> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector12<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,13 >
+{
+ typedef typename V::item13 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13
+ >
+struct vector14
+{
+ typedef aux::vector_tag<14> tag;
+ typedef vector14 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+
+
+ typedef void_ item14;
+ typedef T13 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,14 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<13> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector14<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<14> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector13<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<13> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector14<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<14> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector13<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,14 >
+{
+ typedef typename V::item14 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ >
+struct vector15
+{
+ typedef aux::vector_tag<15> tag;
+ typedef vector15 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+
+
+ typedef void_ item15;
+ typedef T14 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,15 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<14> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector15<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<15> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector14<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<14> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector15<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<15> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector14<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,15 >
+{
+ typedef typename V::item15 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15
+ >
+struct vector16
+{
+ typedef aux::vector_tag<16> tag;
+ typedef vector16 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+
+
+ typedef void_ item16;
+ typedef T15 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,16 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<15> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector16<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<16> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector15<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<15> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector16<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<16> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector15<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,16 >
+{
+ typedef typename V::item16 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16
+ >
+struct vector17
+{
+ typedef aux::vector_tag<17> tag;
+ typedef vector17 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+
+
+ typedef void_ item17;
+ typedef T16 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,17 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<16> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector17<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<17> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector16<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<16> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector17<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<17> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector16<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,17 >
+{
+ typedef typename V::item17 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17
+ >
+struct vector18
+{
+ typedef aux::vector_tag<18> tag;
+ typedef vector18 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+
+
+ typedef void_ item18;
+ typedef T17 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,18 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<17> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector18<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<18> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector17<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<17> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector18<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<18> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector17<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,18 >
+{
+ typedef typename V::item18 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18
+ >
+struct vector19
+{
+ typedef aux::vector_tag<19> tag;
+ typedef vector19 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+
+
+ typedef void_ item19;
+ typedef T18 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,19 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<18> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector19<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<19> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector18<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<18> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector19<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<19> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector18<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,19 >
+{
+ typedef typename V::item19 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ >
+struct vector20
+{
+ typedef aux::vector_tag<20> tag;
+ typedef vector20 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+
+
+ typedef void_ item20;
+ typedef T19 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,20 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<19> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector20<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<20> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector19<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<19> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector20<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<20> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector19<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,20 >
+{
+ typedef typename V::item20 type;
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20
+ >
+struct vector21
+{
+ typedef aux::vector_tag<21> tag;
+ typedef vector21 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+
+
+ typedef void_ item21;
+ typedef T20 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,21 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<20> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector21<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<21> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector20<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<20> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector21<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<21> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector20<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,21 >
+{
+ typedef typename V::item21 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21
+ >
+struct vector22
+{
+ typedef aux::vector_tag<22> tag;
+ typedef vector22 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+
+
+ typedef void_ item22;
+ typedef T21 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,22 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<21> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector22<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<22> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector21<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<21> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector22<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<22> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector21<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,22 >
+{
+ typedef typename V::item22 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22
+ >
+struct vector23
+{
+ typedef aux::vector_tag<23> tag;
+ typedef vector23 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+
+
+ typedef void_ item23;
+ typedef T22 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,23 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<22> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector23<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<23> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector22<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<22> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector23<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<23> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector22<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,23 >
+{
+ typedef typename V::item23 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23
+ >
+struct vector24
+{
+ typedef aux::vector_tag<24> tag;
+ typedef vector24 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+
+
+ typedef void_ item24;
+ typedef T23 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,24 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<23> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector24<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<24> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector23<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<23> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector24<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<24> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector23<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,24 >
+{
+ typedef typename V::item24 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ >
+struct vector25
+{
+ typedef aux::vector_tag<25> tag;
+ typedef vector25 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+
+
+ typedef void_ item25;
+ typedef T24 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,25 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<24> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector25<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<25> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector24<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<24> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector25<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<25> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector24<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,25 >
+{
+ typedef typename V::item25 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ , typename T25
+ >
+struct vector26
+{
+ typedef aux::vector_tag<26> tag;
+ typedef vector26 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+ typedef T25 item25;
+
+
+ typedef void_ item26;
+ typedef T25 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,26 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<25> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector26<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<26> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector25<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ , typename Vector::item25
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<25> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector26<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<26> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector25<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,26 >
+{
+ typedef typename V::item26 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ , typename T25, typename T26
+ >
+struct vector27
+{
+ typedef aux::vector_tag<27> tag;
+ typedef vector27 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+ typedef T25 item25;
+ typedef T26 item26;
+
+
+ typedef void_ item27;
+ typedef T26 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,27 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<26> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector27<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<27> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector26<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ , typename Vector::item25, typename Vector::item26
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<26> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector27<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<27> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector26<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,27 >
+{
+ typedef typename V::item27 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ , typename T25, typename T26, typename T27
+ >
+struct vector28
+{
+ typedef aux::vector_tag<28> tag;
+ typedef vector28 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+ typedef T25 item25;
+ typedef T26 item26;
+ typedef T27 item27;
+
+
+ typedef void_ item28;
+ typedef T27 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,28 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<27> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector28<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<28> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector27<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ , typename Vector::item25, typename Vector::item26
+ , typename Vector::item27
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<27> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector28<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<28> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector27<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,28 >
+{
+ typedef typename V::item28 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ , typename T25, typename T26, typename T27, typename T28
+ >
+struct vector29
+{
+ typedef aux::vector_tag<29> tag;
+ typedef vector29 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+ typedef T25 item25;
+ typedef T26 item26;
+ typedef T27 item27;
+ typedef T28 item28;
+
+
+ typedef void_ item29;
+ typedef T28 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,29 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<28> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector29<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<29> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector28<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ , typename Vector::item25, typename Vector::item26
+ , typename Vector::item27, typename Vector::item28
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<28> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector29<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<29> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector28<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,29 >
+{
+ typedef typename V::item29 type;
+};
+
+template<
+ typename T0, typename T1, typename T2, typename T3, typename T4
+ , typename T5, typename T6, typename T7, typename T8, typename T9
+ , typename T10, typename T11, typename T12, typename T13, typename T14
+ , typename T15, typename T16, typename T17, typename T18, typename T19
+ , typename T20, typename T21, typename T22, typename T23, typename T24
+ , typename T25, typename T26, typename T27, typename T28, typename T29
+ >
+struct vector30
+{
+ typedef aux::vector_tag<30> tag;
+ typedef vector30 type;
+ typedef T0 item0;
+ typedef T1 item1;
+ typedef T2 item2;
+ typedef T3 item3;
+ typedef T4 item4;
+ typedef T5 item5;
+ typedef T6 item6;
+ typedef T7 item7;
+ typedef T8 item8;
+ typedef T9 item9;
+ typedef T10 item10;
+ typedef T11 item11;
+ typedef T12 item12;
+ typedef T13 item13;
+ typedef T14 item14;
+ typedef T15 item15;
+ typedef T16 item16;
+ typedef T17 item17;
+ typedef T18 item18;
+ typedef T19 item19;
+ typedef T20 item20;
+ typedef T21 item21;
+ typedef T22 item22;
+ typedef T23 item23;
+ typedef T24 item24;
+ typedef T25 item25;
+ typedef T26 item26;
+ typedef T27 item27;
+ typedef T28 item28;
+ typedef T29 item29;
+
+
+ typedef void_ item30;
+ typedef T29 back;
+ typedef v_iter< type,0 > begin;
+ typedef v_iter< type,30 > end;
+};
+
+template<>
+struct push_front_impl< aux::vector_tag<29> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector30<
+ T
+ ,
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ , typename Vector::item28
+ > type;
+ };
+};
+
+template<>
+struct pop_front_impl< aux::vector_tag<30> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector29<
+ typename Vector::item1, typename Vector::item2
+ , typename Vector::item3, typename Vector::item4
+ , typename Vector::item5, typename Vector::item6
+ , typename Vector::item7, typename Vector::item8
+ , typename Vector::item9, typename Vector::item10
+ , typename Vector::item11, typename Vector::item12
+ , typename Vector::item13, typename Vector::item14
+ , typename Vector::item15, typename Vector::item16
+ , typename Vector::item17, typename Vector::item18
+ , typename Vector::item19, typename Vector::item20
+ , typename Vector::item21, typename Vector::item22
+ , typename Vector::item23, typename Vector::item24
+ , typename Vector::item25, typename Vector::item26
+ , typename Vector::item27, typename Vector::item28
+ , typename Vector::item29
+ > type;
+ };
+};
+
+template<>
+struct push_back_impl< aux::vector_tag<29> >
+{
+ template< typename Vector, typename T > struct apply
+ {
+ typedef vector30<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ , typename Vector::item28
+ ,
+ T
+ > type;
+ };
+};
+
+template<>
+struct pop_back_impl< aux::vector_tag<30> >
+{
+ template< typename Vector > struct apply
+ {
+ typedef vector29<
+ typename Vector::item0, typename Vector::item1
+ , typename Vector::item2, typename Vector::item3
+ , typename Vector::item4, typename Vector::item5
+ , typename Vector::item6, typename Vector::item7
+ , typename Vector::item8, typename Vector::item9
+ , typename Vector::item10, typename Vector::item11
+ , typename Vector::item12, typename Vector::item13
+ , typename Vector::item14, typename Vector::item15
+ , typename Vector::item16, typename Vector::item17
+ , typename Vector::item18, typename Vector::item19
+ , typename Vector::item20, typename Vector::item21
+ , typename Vector::item22, typename Vector::item23
+ , typename Vector::item24, typename Vector::item25
+ , typename Vector::item26, typename Vector::item27
+ , typename Vector::item28
+ > type;
+ };
+};
+
+template< typename V >
+struct v_at< V,30 >
+{
+ typedef typename V::item30 type;
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Value > struct always
+{
+ template<
+ typename T1 = na , typename T2 = na , typename T3 = na , typename T4 = na , typename T5 = na
+ >
+ struct apply
+ {
+ typedef Value type;
+ };
+};
+
+
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+namespace detail{
+
+
+
+
+template <class T>
+struct remove_rvalue_ref
+{
+ typedef T type;
+};
+
+
+
+
+
+
+
+
+}
+
+template< typename T > struct remove_reference { public: typedef typename boost::detail::remove_rvalue_ref<T>::type type; };
+template< typename T > struct remove_reference<T&> { public: typedef T type; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template <typename T>
+struct add_pointer_impl
+{
+ typedef typename remove_reference<T>::type no_ref_type;
+ typedef no_ref_type* type;
+};
+
+
+
+}
+
+template< typename T > struct add_pointer { public: typedef typename boost::detail::add_pointer_impl<T>::type type; };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template <typename T>
+struct add_reference_rvalue_layer
+{
+ typedef T& type;
+};
+
+
+
+
+
+
+
+
+
+template <typename T>
+struct add_reference_impl
+{
+ typedef typename add_reference_rvalue_layer<T>::type type;
+};
+
+
+template< typename T > struct add_reference_impl<T&> { public: typedef T& type; };
+
+
+
+
+
+template<> struct add_reference_impl<void> { public: typedef void type; };
+
+template<> struct add_reference_impl<void const> { public: typedef void const type; };
+template<> struct add_reference_impl<void volatile> { public: typedef void volatile type; };
+template<> struct add_reference_impl<void const volatile> { public: typedef void const volatile type; };
+
+
+}
+
+template< typename T > struct add_reference { public: typedef typename boost::detail::add_reference_impl<T>::type type; };
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types { namespace detail {
+
+using mpl::placeholders::_;
+
+
+template<typename T, typename L>
+struct class_transform
+{ typedef typename mpl::apply1<L,T>::type type; };
+
+
+
+
+
+
+
+template<typename T> struct class_transform< T, mpl::identity<_> >
+{ typedef T type; };
+
+template<typename T> struct class_transform< T, add_reference<_> >
+{ typedef T & type; };
+
+template<typename T> struct class_transform< T, add_pointer<_> >
+{ typedef T * type; };
+
+template<typename T> struct class_transform< T, remove_cv<_> >
+{ typedef typename boost::remove_cv<T>::type type; };
+
+template<typename T> struct class_transform< T, add_reference< remove_cv<_> > >
+{ typedef typename boost::remove_cv<T>::type & type; };
+
+template<typename T> struct class_transform< T, add_pointer< remove_cv<_> > >
+{ typedef typename boost::remove_cv<T>::type * type; };
+
+template<typename T, typename U> struct class_transform< T, mpl::always<U> >
+{ typedef U type; };
+
+
+
+} } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Tag1
+ , typename Tag2
+ >
+struct bitxor_impl
+ : if_c<
+ ( Tag1::value
+ > Tag2::value
+ )
+
+ , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >
+ , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >
+ >::type
+{
+};
+
+
+template<> struct bitxor_impl< na,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct bitxor_impl< na,Tag >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct bitxor_impl< Tag,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename T > struct bitxor_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N1 = na
+ , typename N2 = na
+ , typename N3 = na, typename N4 = na, typename N5 = na
+ >
+struct bitxor_
+ : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+ typename N1, typename N2, typename N3, typename N4
+ >
+struct bitxor_< N1,N2,N3,N4,na >
+
+ : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>
+{
+
+};
+
+template<
+ typename N1, typename N2, typename N3
+ >
+struct bitxor_< N1,N2,N3,na,na >
+
+ : bitxor_< bitxor_< N1,N2 >, N3>
+{
+
+};
+
+template<
+ typename N1, typename N2
+ >
+struct bitxor_< N1,N2,na,na,na >
+ : bitxor_impl<
+ typename bitxor_tag<N1>::type
+ , typename bitxor_tag<N2>::type
+ >::template apply< N1,N2 >::type
+{
+
+
+};
+
+template<> struct bitxor_< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : bitxor_< T1 , T2 > { }; }; template< typename Tag > struct lambda< bitxor_< na , na > , Tag > { typedef false_ is_le; typedef bitxor_< na , na > result_; typedef bitxor_< na , na > type; };
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitxor_impl< integral_c_tag,integral_c_tag >
+{
+ template< typename N1, typename N2 > struct apply
+
+ : integral_c<
+ typename aux::largest_int<
+ typename N1::value_type
+ , typename N2::value_type
+ >::type
+ , ( N1::value
+ ^ N2::value
+ )
+ >
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types {
+
+namespace detail
+{
+ typedef long bits_t;
+
+ template<bits_t Value> struct constant
+ : boost::integral_constant<bits_t,Value>
+ { };
+
+ template<bits_t Bits, bits_t Mask> struct property_tag
+ {
+ typedef constant<Bits> bits;
+ typedef constant<Mask> mask;
+ };
+
+ template<typename T> struct bits : T::bits { };
+ template<typename T> struct mask : T::mask { };
+
+
+ template<bits_t Bits, bits_t CCID> struct encode_bits_impl;
+
+
+ template<bits_t LHS_bits, bits_t LHS_mask,
+ bits_t RHS_bits, bits_t RHS_mask>
+ struct tag_ice;
+
+
+ template<class Tag, class RegTag = Tag> struct retag_default_cc;
+
+ template<bits_t Bits, bits_t CCID> struct encode_bits
+ : constant<
+ ::boost::function_types::detail::encode_bits_impl<Bits,CCID>::value
+ >
+ { };
+
+ template<class LHS, class RHS> struct compound_tag
+ {
+ typedef constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<LHS>::value
+ , ::boost::function_types::detail::mask<LHS>::value
+ , ::boost::function_types::detail::bits<RHS>::value
+ , ::boost::function_types::detail::mask<RHS>::value
+ >::combined_bits
+ > bits;
+
+ typedef constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<LHS>::value
+ , ::boost::function_types::detail::mask<LHS>::value
+ , ::boost::function_types::detail::bits<RHS>::value
+ , ::boost::function_types::detail::mask<RHS>::value
+ >::combined_mask
+ > mask;
+ };
+
+ template <class Base, class PropOld, class PropNew>
+ struct changed_tag
+ : Base
+ {
+ typedef mpl::bitxor_
+ <typename Base::bits, typename PropOld::bits, typename PropNew::bits>
+ bits;
+ };
+
+ template<class Tag, class QueryTag> struct represents_impl
+ : boost::integral_constant<bool,
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<Tag>::value
+ , ::boost::function_types::detail::mask<Tag>::value
+ , ::boost::function_types::detail::bits<QueryTag>::value
+ , ::boost::function_types::detail::mask<QueryTag>::value
+ >::match
+ >
+ { };
+
+}
+
+typedef detail::property_tag<0,0> null_tag;
+
+template<class Tag1, class Tag2, class Tag3 = null_tag, class Tag4 = null_tag>
+struct tag
+ : detail::compound_tag< detail::compound_tag<Tag1,Tag2>,
+ detail::compound_tag<Tag3,Tag4> >
+{ };
+
+
+template<class Tag1, class Tag2, class Tag3> struct tag<Tag1,Tag2,Tag3,null_tag>
+ : detail::compound_tag<detail::compound_tag<Tag1,Tag2>,Tag3>
+{ };
+template<class Tag1, class Tag2> struct tag<Tag1,Tag2,null_tag,null_tag>
+ : detail::compound_tag<Tag1,Tag2>
+{ };
+template<class Tag1> struct tag<Tag1,null_tag,null_tag,null_tag>
+ : Tag1
+{ };
+
+
+
+template<class Tag, class QueryTag> struct represents
+ : detail::represents_impl<Tag, detail::retag_default_cc<QueryTag,Tag> >
+{ };
+
+
+template<class Tag, class QueryTag> struct extract
+{
+ typedef detail::constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<Tag>::value
+ , ::boost::function_types::detail::mask<Tag>::value
+ , ::boost::function_types::detail::bits<QueryTag>::value
+ , ::boost::function_types::detail::mask<QueryTag>::value
+ >::extracted_bits
+ > bits;
+
+ typedef detail::constant<
+ ::boost::function_types::detail::mask<QueryTag>::value
+ > mask;
+};
+
+} }
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types {
+typedef detail::property_tag<0x00000200,0x00000300> non_variadic;
+typedef detail::property_tag<0x00000100,0x00000300> variadic;
+typedef detail::property_tag<0,0x00000400> non_const;
+typedef detail::property_tag<0x00000400,0x00000400> const_qualified;
+typedef detail::property_tag<0,0x00000800> non_volatile;
+typedef detail::property_tag<0x00000800,0x00000800> volatile_qualified;
+typedef detail::property_tag<0x00008000,0x00ff8000> default_cc;
+typedef detail::property_tag<0 , 3072> non_cv;
+typedef detail::property_tag<0x00000400 , 3072> const_non_volatile;
+typedef detail::property_tag<0x00000800, 3072> volatile_non_const;
+typedef detail::property_tag<3072 , 3072> cv_qualified;
+namespace detail {
+typedef constant<0x00ff0fff> full_mask;
+template <bits_t Flags, bits_t CCID> struct encode_bits_impl
+{
+static const bits_t value = Flags | (0x00008000 * CCID) << 1;
+};
+template <bits_t Flags, bits_t CCID, std::size_t Arity>
+struct encode_charr_impl
+{
+static const std::size_t value = (std::size_t)(1+ Flags | (0x00008000 * CCID) << 1 | Arity << 24 );
+};
+template <bits_t Bits> struct decode_bits
+{
+static const bits_t flags = Bits & 0x00000fff;
+static const bits_t cc_id = ( (Bits & 0x00ff0fff) / 0x00008000) >> 1;
+static const bits_t tag_bits = (Bits & 0x00ff0fff);
+static const std::size_t arity = (std::size_t) (Bits >> 24);
+};
+template <bits_t LHS_bits, bits_t LHS_mask, bits_t RHS_bits, bits_t RHS_mask>
+struct tag_ice
+{
+static const bool match = RHS_bits == (LHS_bits & RHS_mask & (RHS_bits | ~0x000000ff));
+static const bits_t combined_bits = (LHS_bits & ~RHS_mask) | RHS_bits;
+static const bits_t combined_mask = LHS_mask | RHS_mask;
+static const bits_t extracted_bits = LHS_bits & RHS_mask;
+};
+typedef property_tag<0x00000001,0x000000ff> callable_builtin_tag;
+typedef property_tag<0x00000003,0x000000ff> nonmember_callable_builtin_tag;
+typedef property_tag<0x00000007,0x000000ff> function_tag;
+typedef property_tag<0x00000013,0x000000ff> reference_tag;
+typedef property_tag<0x0000000b,0x000000ff> pointer_tag;
+typedef property_tag<0x00000061,0x000000ff> member_function_pointer_tag;
+typedef property_tag<0x000000a3,0x000000ff> member_object_pointer_tag;
+typedef property_tag<0x000002a3,0x00ff0fff> member_object_pointer_base;
+typedef property_tag<0x00000020,0x000000ff> member_pointer_tag;
+typedef property_tag< 33287 , 16745471 > nv_dcc_func;
+typedef property_tag< 33377 , 16745471 > nv_dcc_mfp;
+}
+} }
+
+
+namespace boost { namespace function_types {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ struct implicit_cc
+ {
+ typedef detail::encode_bits<0,1> bits;
+ typedef detail::constant<0x00ff8000> mask;
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} }
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+
+ using mpl::placeholders::_;
+
+ template< typename T, typename ClassTypeTransform = add_reference<_> >
+ struct components;
+
+ namespace detail
+ {
+ template<typename T, typename L> struct components_impl;
+
+
+
+ }
+
+ template<typename T, typename ClassTypeTransform>
+ struct components
+
+ : detail::components_impl<T, ClassTypeTransform>
+
+
+
+
+ {
+ typedef components<T,ClassTypeTransform> type;
+
+
+ };
+
+
+
+ namespace detail {
+
+ struct components_mpl_sequence_tag;
+
+ struct components_non_func_base
+ {
+ typedef mpl::vector0<> types;
+ typedef void function_arity;
+
+ typedef detail::constant<0> bits;
+ typedef detail::constant<0> mask;
+
+ typedef components_mpl_sequence_tag tag;
+ };
+
+ template
+ < typename Components
+ , typename IfTagged
+ , typename ThenTag
+ , typename DefaultBase = components_non_func_base
+ >
+ struct retagged_if
+ : mpl::if_
+ < detail::represents_impl<Components, IfTagged>
+ , detail::changed_tag<Components,IfTagged,ThenTag>
+ , DefaultBase
+ >::type
+ { };
+
+
+
+
+
+ template<typename T, typename L>
+ struct components_impl
+ : detail::retagged_if
+ < detail::components_impl<T*,L>
+ , pointer_tag, function_tag >
+ { };
+ template<typename T, typename L>
+ struct components_impl<T&, L>
+ : detail::retagged_if
+ < detail::components_impl<T*,L>
+ , pointer_tag, reference_tag >
+ { };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<typename T, typename L>
+ struct components_impl<T*, L>
+ : components_non_func_base
+ { };
+
+
+ template<typename T, typename L>
+ struct components_impl<T* const, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T* volatile, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T* const volatile, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T const, L>
+ : components_impl<T,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T volatile, L>
+ : components_impl<T,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T const volatile, L>
+ : components_impl<T,L>
+ { };
+
+
+ template<typename T, class C>
+ struct member_obj_ptr_result
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C const>
+ { typedef T const & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C volatile>
+ { typedef T volatile & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C const volatile>
+ { typedef T const volatile & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C const>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C volatile>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C const volatile>
+ { typedef T & type; };
+
+ template<typename T, class C, typename L>
+ struct member_obj_ptr_components
+ : member_object_pointer_base
+ {
+ typedef function_types::components<T C::*, L> type;
+ typedef components_mpl_sequence_tag tag;
+
+ typedef mpl::integral_c<std::size_t,1> function_arity;
+
+ typedef mpl::vector2< typename detail::member_obj_ptr_result<T,C>::type,
+ typename detail::class_transform<C,L>::type > types;
+ };
+
+
+
+
+ template<typename T, class C, typename L>
+ struct components_impl<T C::*, L>
+ : member_obj_ptr_components<T,C,L>
+ { };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R, typename L>
+struct components_impl<R ( * ) ( ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) ( ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,0> function_arity;
+typedef mpl::vector1< R > types;
+};
+template< typename R , typename T0, typename L>
+struct components_impl<R ( * ) (T0 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R , T0 > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( * ) (T0 , T1 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R , T0 , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R , T0 , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R , T0 , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R , T0 , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R , T0 , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) , L>
+{
+typedef encode_bits<523,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R, typename L>
+struct components_impl<R ( * ) ( ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) ( ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,0> function_arity;
+typedef mpl::vector1< R > types;
+};
+template< typename R , typename T0, typename L>
+struct components_impl<R ( * ) (T0 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R , T0 > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( * ) (T0 , T1 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R , T0 , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R , T0 , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R , T0 , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R , T0 , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R , T0 , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) , L>
+{
+typedef encode_bits<267,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( * ) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 , L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 , L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 , L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) , L>
+{
+typedef encode_bits<609,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 , L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 , L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 , L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) , L>
+{
+typedef encode_bits<353,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) , L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 , L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 const, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 const, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 const, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const, L>
+{
+typedef encode_bits<1633,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 const, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 const, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 const, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const, L>
+{
+typedef encode_bits<1377,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 const, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 volatile, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 volatile, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) volatile, L>
+{
+typedef encode_bits<2657,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 volatile, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 volatile, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile, L>
+{
+typedef encode_bits<2401,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 const volatile, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 const volatile, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const volatile, L>
+{
+typedef encode_bits<3681,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0, typename L>
+struct components_impl<R ( T0::* ) ( ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) ( ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 const volatile, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<R ( T0::* ) (T1 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 const volatile, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile, L>
+{
+typedef encode_bits<3425,1> bits;
+typedef constant<0x00ff0fff> mask;
+typedef function_types::components<R ( T0::* ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 const volatile, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ } }
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<> struct size_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::size <typename S::types>
+ { };
+};
+template<> struct empty_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::empty <typename S::types>
+ { };
+};
+template<> struct front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::front <typename S::types>
+ { };
+};
+template<> struct back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::back <typename S::types>
+ { };
+};
+template<> struct at_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename N > struct apply
+ : mpl::at <typename S::types, N >
+ { };
+};
+template<> struct begin_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::begin <typename S::types>
+ { };
+};
+template<> struct end_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::end <typename S::types>
+ { };
+};
+template<> struct clear_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::clear< typename S::types >::type types;
+ };
+};
+template<>
+struct push_front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename T >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::push_front< typename S::types, T >::type types;
+ };
+};
+template<>
+struct pop_front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::pop_front< typename S::types >::type types;
+ };
+};
+template<>
+struct push_back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename T >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::push_back< typename S::types, T >::type types;
+ };
+};
+template<>
+struct pop_back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::pop_back< typename S::types >::type types;
+ };
+};
+
+} }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Tag1
+ , typename Tag2
+ >
+struct bitand_impl
+ : if_c<
+ ( Tag1::value
+ > Tag2::value
+ )
+
+ , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >
+ , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >
+ >::type
+{
+};
+
+
+template<> struct bitand_impl< na,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct bitand_impl< na,Tag >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct bitand_impl< Tag,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename T > struct bitand_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N1 = na
+ , typename N2 = na
+ , typename N3 = na, typename N4 = na, typename N5 = na
+ >
+struct bitand_
+ : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>
+{
+};
+
+template<
+ typename N1, typename N2, typename N3, typename N4
+ >
+struct bitand_< N1,N2,N3,N4,na >
+
+ : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>
+{
+
+};
+
+template<
+ typename N1, typename N2, typename N3
+ >
+struct bitand_< N1,N2,N3,na,na >
+
+ : bitand_< bitand_< N1,N2 >, N3>
+{
+
+};
+
+template<
+ typename N1, typename N2
+ >
+struct bitand_< N1,N2,na,na,na >
+ : bitand_impl<
+ typename bitand_tag<N1>::type
+ , typename bitand_tag<N2>::type
+ >::template apply< N1,N2 >::type
+{
+
+
+};
+
+template<> struct bitand_< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : bitand_< T1 , T2 > { }; }; template< typename Tag > struct lambda< bitand_< na , na > , Tag > { typedef false_ is_le; typedef bitand_< na , na > result_; typedef bitand_< na , na > type; };
+
+}}
+
+namespace boost { namespace mpl {
+template<>
+struct bitand_impl< integral_c_tag,integral_c_tag >
+{
+ template< typename N1, typename N2 > struct apply
+
+ : integral_c<
+ typename aux::largest_int<
+ typename N1::value_type
+ , typename N2::value_type
+ >::type
+ , ( N1::value
+ & N2::value
+ )
+ >
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types {
+namespace detail
+{
+template<class Tag, class RefTag> struct selector_bits
+{
+static const bits_t value = ( (::boost::function_types::detail::bits<Tag> ::value & 0x00008000) | (::boost::function_types::detail::bits<RefTag> ::value & 802) );
+};
+template<bits_t SelectorBits> struct default_cc_tag;
+template<class Tag, class RefTag> struct retag_default_cc
+: detail::compound_tag
+< Tag, detail::default_cc_tag<
+::boost::function_types::detail::selector_bits<Tag,RefTag> ::value > >
+{ };
+template<bits_t SelectorBits> struct default_cc_tag
+{
+typedef null_tag::bits bits;
+typedef null_tag::mask mask;
+};
+class test_class;
+typedef constant<0x00ff8000> cc_mask_constant;
+template< > struct default_cc_tag<33282>
+{
+typedef void ( *tester)();
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33026>
+{
+typedef void ( *tester)( ... );
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33312>
+{
+typedef void (test_class:: *tester)();
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33056>
+{
+typedef void (test_class:: *tester)( ... );
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+} } }
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::function_tag>
+ >
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function_pointer
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::pointer_tag>
+ >
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function_reference
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::reference_tag> >
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Tag1
+ , typename Tag2
+ >
+struct less_impl
+ : if_c<
+ ( Tag1::value
+ > Tag2::value
+ )
+
+ , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >
+ , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >
+ >::type
+{
+};
+
+
+template<> struct less_impl< na,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct less_impl< na,Tag >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename Tag > struct less_impl< Tag,na >
+{
+ template< typename U1, typename U2 > struct apply
+ {
+ typedef apply type;
+ static const int value = 0;
+ };
+};
+
+template< typename T > struct less_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N1 = na
+ , typename N2 = na
+ >
+struct less
+
+ : less_impl<
+ typename less_tag<N1>::type
+ , typename less_tag<N2>::type
+ >::template apply< N1,N2 >::type
+{
+};
+
+template<> struct less< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : less< T1 , T2 > { }; }; template< typename Tag > struct lambda< less< na , na > , Tag > { typedef false_ is_le; typedef less< na , na > result_; typedef less< na , na > type; };
+
+}}
+
+namespace boost { namespace mpl {
+
+template<>
+struct less_impl< integral_c_tag,integral_c_tag >
+{
+ template< typename N1, typename N2 > struct apply
+
+ : bool_< ( N2::value > N1::value ) >
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template< typename Tag > struct negate_impl;
+
+template< typename T > struct negate_tag
+{
+ typedef typename T::tag type;
+};
+
+template<
+ typename N = na
+ >
+struct negate
+
+ : negate_impl<
+ typename negate_tag<N>::type
+ >::template apply<N>::type
+
+
+
+
+
+
+{
+
+};
+
+template<> struct negate< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : negate< T1 > { }; }; template< typename Tag > struct lambda< negate< na > , Tag > { typedef false_ is_le; typedef negate< na > result_; typedef negate< na > type; };
+
+
+
+
+
+
+
+
+
+
+
+
+template<>
+struct negate_impl<integral_c_tag>
+{
+
+
+
+
+ template< typename N > struct apply
+ : integral_c< typename N::value_type, (-N::value) >
+
+ {
+ };
+};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_forward;
+template<>
+struct advance_forward<0>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef iter0 type;
+ };
+};
+
+template<>
+struct advance_forward<1>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename next<iter0>::type iter1;
+ typedef iter1 type;
+ };
+};
+
+template<>
+struct advance_forward<2>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename next<iter0>::type iter1;
+ typedef typename next<iter1>::type iter2;
+ typedef iter2 type;
+ };
+};
+
+template<>
+struct advance_forward<3>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename next<iter0>::type iter1;
+ typedef typename next<iter1>::type iter2;
+ typedef typename next<iter2>::type iter3;
+ typedef iter3 type;
+ };
+};
+
+template<>
+struct advance_forward<4>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename next<iter0>::type iter1;
+ typedef typename next<iter1>::type iter2;
+ typedef typename next<iter2>::type iter3;
+ typedef typename next<iter3>::type iter4;
+ typedef iter4 type;
+ };
+};
+
+template< long N >
+struct advance_forward
+{
+ template< typename Iterator > struct apply
+ {
+ typedef typename apply_wrap1<
+ advance_forward<4>
+ , Iterator
+ >::type chunk_result_;
+
+ typedef typename apply_wrap1<
+ advance_forward<(
+ (N - 4) < 0
+ ? 0
+ : N - 4
+ )>
+ , chunk_result_
+ >::type type;
+ };
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+template< long N > struct advance_backward;
+template<>
+struct advance_backward<0>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef iter0 type;
+ };
+};
+
+template<>
+struct advance_backward<1>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename prior<iter0>::type iter1;
+ typedef iter1 type;
+ };
+};
+
+template<>
+struct advance_backward<2>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename prior<iter0>::type iter1;
+ typedef typename prior<iter1>::type iter2;
+ typedef iter2 type;
+ };
+};
+
+template<>
+struct advance_backward<3>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename prior<iter0>::type iter1;
+ typedef typename prior<iter1>::type iter2;
+ typedef typename prior<iter2>::type iter3;
+ typedef iter3 type;
+ };
+};
+
+template<>
+struct advance_backward<4>
+{
+ template< typename Iterator > struct apply
+ {
+ typedef Iterator iter0;
+ typedef typename prior<iter0>::type iter1;
+ typedef typename prior<iter1>::type iter2;
+ typedef typename prior<iter2>::type iter3;
+ typedef typename prior<iter3>::type iter4;
+ typedef iter4 type;
+ };
+};
+
+template< long N >
+struct advance_backward
+{
+ template< typename Iterator > struct apply
+ {
+ typedef typename apply_wrap1<
+ advance_backward<4>
+ , Iterator
+ >::type chunk_result_;
+
+ typedef typename apply_wrap1<
+ advance_backward<(
+ (N - 4) < 0
+ ? 0
+ : N - 4
+ )>
+ , chunk_result_
+ >::type type;
+ };
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+template< typename Tag >
+struct advance_impl
+{
+ template< typename Iterator, typename N > struct apply
+ {
+ typedef typename less< N,long_<0> >::type backward_;
+ typedef typename if_< backward_, negate<N>, N >::type offset_;
+
+ typedef typename if_<
+ backward_
+ , aux::advance_backward< offset_::value >
+ , aux::advance_forward< offset_::value >
+ >::type f_;
+
+ typedef typename apply_wrap1<f_,Iterator>::type type;
+ };
+};
+
+
+template<
+ typename Iterator = na
+ , typename N = na
+ >
+struct advance
+ : advance_impl< typename tag<Iterator>::type >
+ ::template apply<Iterator,N>
+{
+};
+
+template<
+ typename Iterator
+ , long N
+ >
+struct advance_c
+ : advance_impl< typename tag<Iterator>::type >
+ ::template apply<Iterator,long_<N> >
+{
+};
+
+template<> struct advance< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : advance< T1 , T2 > { }; }; template< typename Tag > struct lambda< advance< na , na > , Tag > { typedef false_ is_le; typedef advance< na , na > result_; typedef advance< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+template< typename Tag >
+struct at_impl
+{
+ template< typename Sequence, typename N > struct apply
+ {
+ typedef typename advance<
+ typename begin<Sequence>::type
+ , N
+ >::type iter_;
+
+ typedef typename deref<iter_>::type type;
+ };
+};
+
+ template<> struct at_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename N = na
+ >
+struct at
+ : at_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence,N >
+{
+
+};
+
+template<
+ typename Sequence
+ , long N
+ >
+struct at_c
+ : at_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence,mpl::long_<N> >
+{
+};
+
+template<> struct at< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : at< T1 , T2 > { }; }; template< typename Tag > struct lambda< at< na , na > , Tag > { typedef false_ is_le; typedef at< na , na > result_; typedef at< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl { namespace aux {
+
+
+
+template<
+ int N
+ , typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl;
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< 0,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef state0 state;
+ typedef iter0 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< 1,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+
+
+ typedef state1 state;
+ typedef iter1 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< 2,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+
+
+ typedef state2 state;
+ typedef iter2 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< 3,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+ typedef typename mpl::next<iter2>::type iter3;
+
+
+ typedef state3 state;
+ typedef iter3 iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< 4,First,Last,State,ForwardOp >
+{
+ typedef First iter0;
+ typedef State state0;
+ typedef typename apply2< ForwardOp,state0,iter0 >::type state1;
+ typedef typename mpl::next<iter0>::type iter1;
+ typedef typename apply2< ForwardOp,state1,iter1 >::type state2;
+ typedef typename mpl::next<iter1>::type iter2;
+ typedef typename apply2< ForwardOp,state2,iter2 >::type state3;
+ typedef typename mpl::next<iter2>::type iter3;
+ typedef typename apply2< ForwardOp,state3,iter3 >::type state4;
+ typedef typename mpl::next<iter3>::type iter4;
+
+
+ typedef state4 state;
+ typedef iter4 iterator;
+};
+
+template<
+ int N
+ , typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl
+{
+ typedef iter_fold_impl<
+ 4
+ , First
+ , Last
+ , State
+ , ForwardOp
+ > chunk_;
+
+ typedef iter_fold_impl<
+ ( (N - 4) < 0 ? 0 : N - 4 )
+ , typename chunk_::iterator
+ , Last
+ , typename chunk_::state
+ , ForwardOp
+ > res_;
+
+ typedef typename res_::state state;
+ typedef typename res_::iterator iterator;
+};
+
+template<
+ typename First
+ , typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< -1,First,Last,State,ForwardOp >
+ : iter_fold_impl<
+ -1
+ , typename mpl::next<First>::type
+ , Last
+ , typename apply2< ForwardOp,State,First >::type
+ , ForwardOp
+ >
+{
+};
+
+template<
+ typename Last
+ , typename State
+ , typename ForwardOp
+ >
+struct iter_fold_impl< -1,Last,Last,State,ForwardOp >
+{
+ typedef State state;
+ typedef Last iterator;
+};
+
+}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ , typename State = na
+ , typename ForwardOp = na
+ >
+struct iter_fold
+{
+ typedef typename aux::iter_fold_impl<
+ ::boost::mpl::O1_size<Sequence>::value
+ , typename begin<Sequence>::type
+ , typename end<Sequence>::type
+ , State
+ , typename lambda<ForwardOp>::type
+ >::state type;
+
+
+};
+
+template<> struct iter_fold< na , na , na > { template< typename T1 , typename T2 , typename T3 , typename T4 =na , typename T5 =na > struct apply : iter_fold< T1 , T2 , T3 > { }; }; template< typename Tag > struct lambda< iter_fold< na , na , na > , Tag > { typedef false_ is_le; typedef iter_fold< na , na , na > result_; typedef iter_fold< na , na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+struct iterator_range_tag;
+
+template<
+ typename First = na
+ , typename Last = na
+ >
+struct iterator_range
+{
+ typedef iterator_range_tag tag;
+ typedef iterator_range type;
+ typedef First begin;
+ typedef Last end;
+
+
+};
+
+template<> struct iterator_range< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : iterator_range< T1 , T2 > { }; }; template< typename Tag > struct lambda< iterator_range< na , na > , Tag > { typedef false_ is_le; typedef iterator_range< na , na > result_; typedef iterator_range< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+template< typename Tag > struct distance_impl
+{
+ template< typename First, typename Last > struct apply
+
+ : aux::msvc_eti_base< typename iter_fold<
+ iterator_range<First,Last>
+ , mpl::long_<0>
+ , next<>
+ >::type >
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ };
+};
+
+template<
+ typename First = na
+ , typename Last = na
+ >
+struct distance
+ : distance_impl< typename tag<First>::type >
+ ::template apply<First, Last>
+{
+
+};
+
+template<> struct distance< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : distance< T1 , T2 > { }; }; template< typename Tag > struct lambda< distance< na , na > , Tag > { typedef false_ is_le; typedef distance< na , na > result_; typedef distance< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+template< typename Tag >
+struct size_impl
+{
+ template< typename Sequence > struct apply
+
+ : distance<
+ typename begin<Sequence>::type
+ , typename end<Sequence>::type
+ >
+ {
+
+
+
+
+
+
+
+ };
+};
+
+ template<> struct size_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ >
+struct size
+ : aux::msvc_eti_base<
+ typename size_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >::type
+ >::type
+{
+
+};
+
+template<> struct size< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : size< T1 > { }; }; template< typename Tag > struct lambda< size< na > , Tag > { typedef false_ is_le; typedef size< na > result_; typedef size< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types { namespace detail {
+
+
+
+template<typename T> struct cv_traits
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T &>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T *>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * const>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * volatile>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * const volatile>
+{ typedef non_cv tag; typedef T type; };
+
+template<typename T> struct cv_traits<T const>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const &>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const *>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * const>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * volatile>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * const volatile>
+{ typedef const_non_volatile tag; typedef T type; };
+
+template<typename T> struct cv_traits<T volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile &>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile *>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * const>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * const volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+
+template<typename T> struct cv_traits<T const volatile>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile &>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile *>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * const>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * volatile>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * const volatile>
+{ typedef cv_qualified tag; typedef T type; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace function_types { namespace detail {
+
+template<bits_t Flags, bits_t CCID, std::size_t Size>
+struct synthesize_impl_o
+{
+ template<typename Seq> struct synthesize_impl_i { };
+};
+
+template<typename Seq, bits_t Bits>
+struct synthesize_impl
+ : detail::synthesize_impl_o
+ < ::boost::function_types::detail::decode_bits<Bits>::flags
+ , ::boost::function_types::detail::decode_bits<Bits>::cc_id
+ , ::boost::mpl::size<Seq>::value
+ >
+ ::template synthesize_impl_i<Seq>
+{ };
+
+template<typename Seq, typename Tag>
+struct synthesize_func
+ : detail::synthesize_impl
+ < Seq
+ , ::boost::function_types::detail::bits
+ < detail::retag_default_cc
+ < function_types::tag<nv_dcc_func, Tag> >
+ >::value
+ >
+{ };
+
+template<typename Seq, typename Tag>
+struct synthesize_mfp
+ : detail::synthesize_impl
+ < Seq
+ , ::boost::function_types::detail::bits
+ < detail::retag_default_cc
+ < function_types::tag
+ < typename detail::cv_traits< typename mpl::at_c<Seq,1>::type >::tag
+ , nv_dcc_mfp, Tag
+ > >
+ >::value
+ >
+{ };
+
+template<typename S, typename R = typename mpl::at_c<S,0>::type,
+ typename C = typename mpl::at_c<S,1>::type>
+struct synthesize_mop
+{
+ typedef R C::* type;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R >
+struct make_type_519_1_0
+{
+typedef R type ( ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 1 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+public:
+typedef typename detail::make_type_519_1_0
+< typename mpl::deref< iter_0 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 >
+struct make_type_519_1_1
+{
+typedef R type (T0 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_519_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_519_1_2
+{
+typedef R type (T0 , T1 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_519_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_519_1_3
+{
+typedef R type (T0 , T1 , T2 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_519_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_519_1_4
+{
+typedef R type (T0 , T1 , T2 , T3 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_519_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_519_1_5
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_519_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_519_1_6
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_519_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_519_1_7
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_519_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_519_1_8
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_519_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_519_1_9
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_519_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_519_1_10
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_519_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_519_1_11
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_519_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_519_1_12
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_519_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_519_1_13
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_519_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_519_1_14
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_519_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_519_1_15
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_519_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_519_1_16
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_519_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_519_1_17
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_519_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_519_1_18
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_519_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_519_1_19
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_519_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_519_1_20
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) ;
+};
+template< >
+struct synthesize_impl_o< 519, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_519_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R >
+struct make_type_263_1_0
+{
+typedef R type ( ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 1 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+public:
+typedef typename detail::make_type_263_1_0
+< typename mpl::deref< iter_0 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 >
+struct make_type_263_1_1
+{
+typedef R type (T0 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_263_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_263_1_2
+{
+typedef R type (T0 , T1 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_263_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_263_1_3
+{
+typedef R type (T0 , T1 , T2 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_263_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_263_1_4
+{
+typedef R type (T0 , T1 , T2 , T3 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_263_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_263_1_5
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_263_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_263_1_6
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_263_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_263_1_7
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_263_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_263_1_8
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_263_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_263_1_9
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_263_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_263_1_10
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_263_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_263_1_11
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_263_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_263_1_12
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_263_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_263_1_13
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_263_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_263_1_14
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_263_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_263_1_15
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_263_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_263_1_16
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_263_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_263_1_17
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_263_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_263_1_18
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_263_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_263_1_19
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_263_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_263_1_20
+{
+typedef R type (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) ;
+};
+template< >
+struct synthesize_impl_o< 263, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_263_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_609_1_1
+{
+typedef R ( T0::* type ) ( ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_609_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_609_1_2
+{
+typedef R ( T0::* type ) (T1 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_609_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_609_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_609_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_609_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_609_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_609_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_609_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_609_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_609_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_609_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_609_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_609_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_609_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_609_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_609_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_609_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_609_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_609_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_609_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_609_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_609_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_609_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_609_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_609_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_609_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_609_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_609_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_609_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_609_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_609_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_609_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_609_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_609_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_609_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_609_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_609_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) ;
+};
+template< >
+struct synthesize_impl_o< 609, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_609_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_353_1_1
+{
+typedef R ( T0::* type ) ( ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_353_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_353_1_2
+{
+typedef R ( T0::* type ) (T1 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_353_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_353_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_353_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_353_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_353_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_353_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_353_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_353_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_353_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_353_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_353_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_353_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_353_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_353_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_353_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_353_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_353_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_353_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_353_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_353_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_353_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_353_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_353_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_353_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_353_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_353_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_353_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_353_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_353_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_353_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_353_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_353_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_353_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_353_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_353_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_353_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) ;
+};
+template< >
+struct synthesize_impl_o< 353, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_353_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_1633_1_1
+{
+typedef R ( T0::* type ) ( ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_1633_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_1633_1_2
+{
+typedef R ( T0::* type ) (T1 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_1633_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_1633_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_1633_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_1633_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_1633_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_1633_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_1633_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_1633_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_1633_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_1633_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_1633_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_1633_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_1633_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_1633_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_1633_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_1633_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_1633_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_1633_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_1633_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_1633_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_1633_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_1633_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_1633_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_1633_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_1633_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_1633_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_1633_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_1633_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_1633_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_1633_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_1633_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_1633_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_1633_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_1633_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_1633_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_1633_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const ;
+};
+template< >
+struct synthesize_impl_o< 1633, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_1633_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_1377_1_1
+{
+typedef R ( T0::* type ) ( ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_1377_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_1377_1_2
+{
+typedef R ( T0::* type ) (T1 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_1377_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_1377_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_1377_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_1377_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_1377_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_1377_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_1377_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_1377_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_1377_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_1377_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_1377_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_1377_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_1377_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_1377_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_1377_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_1377_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_1377_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_1377_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_1377_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_1377_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_1377_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_1377_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_1377_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_1377_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_1377_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_1377_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_1377_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_1377_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_1377_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_1377_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_1377_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_1377_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_1377_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_1377_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_1377_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_1377_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const ;
+};
+template< >
+struct synthesize_impl_o< 1377, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_1377_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_2657_1_1
+{
+typedef R ( T0::* type ) ( ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_2657_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_2657_1_2
+{
+typedef R ( T0::* type ) (T1 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_2657_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_2657_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_2657_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_2657_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_2657_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_2657_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_2657_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_2657_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_2657_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_2657_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_2657_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_2657_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_2657_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_2657_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_2657_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_2657_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_2657_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_2657_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_2657_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_2657_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_2657_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_2657_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_2657_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_2657_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_2657_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_2657_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_2657_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_2657_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_2657_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_2657_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_2657_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_2657_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_2657_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_2657_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_2657_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_2657_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2657, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_2657_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_2401_1_1
+{
+typedef R ( T0::* type ) ( ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_2401_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_2401_1_2
+{
+typedef R ( T0::* type ) (T1 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_2401_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_2401_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_2401_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_2401_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_2401_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_2401_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_2401_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_2401_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_2401_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_2401_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_2401_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_2401_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_2401_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_2401_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_2401_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_2401_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_2401_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_2401_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_2401_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_2401_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_2401_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_2401_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_2401_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_2401_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_2401_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_2401_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_2401_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_2401_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_2401_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_2401_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_2401_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_2401_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_2401_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_2401_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_2401_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_2401_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile ;
+};
+template< >
+struct synthesize_impl_o< 2401, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_2401_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_3681_1_1
+{
+typedef R ( T0::* type ) ( ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_3681_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_3681_1_2
+{
+typedef R ( T0::* type ) (T1 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_3681_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_3681_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_3681_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_3681_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_3681_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_3681_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_3681_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_3681_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_3681_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_3681_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_3681_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_3681_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_3681_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_3681_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_3681_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_3681_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_3681_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_3681_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_3681_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_3681_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_3681_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_3681_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_3681_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_3681_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_3681_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_3681_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_3681_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_3681_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_3681_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_3681_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_3681_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_3681_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_3681_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_3681_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_3681_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_3681_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3681, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_3681_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename R , typename T0 >
+struct make_type_3425_1_1
+{
+typedef R ( T0::* type ) ( ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::make_type_3425_1_1
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct make_type_3425_1_2
+{
+typedef R ( T0::* type ) (T1 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::make_type_3425_1_2
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct make_type_3425_1_3
+{
+typedef R ( T0::* type ) (T1 , T2 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::make_type_3425_1_3
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct make_type_3425_1_4
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::make_type_3425_1_4
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct make_type_3425_1_5
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::make_type_3425_1_5
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct make_type_3425_1_6
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::make_type_3425_1_6
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct make_type_3425_1_7
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::make_type_3425_1_7
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct make_type_3425_1_8
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::make_type_3425_1_8
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct make_type_3425_1_9
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::make_type_3425_1_9
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct make_type_3425_1_10
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::make_type_3425_1_10
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct make_type_3425_1_11
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::make_type_3425_1_11
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct make_type_3425_1_12
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::make_type_3425_1_12
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct make_type_3425_1_13
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::make_type_3425_1_13
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct make_type_3425_1_14
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::make_type_3425_1_14
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct make_type_3425_1_15
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::make_type_3425_1_15
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct make_type_3425_1_16
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::make_type_3425_1_16
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct make_type_3425_1_17
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::make_type_3425_1_17
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct make_type_3425_1_18
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::make_type_3425_1_18
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct make_type_3425_1_19
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::make_type_3425_1_19
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct make_type_3425_1_20
+{
+typedef R ( T0::* type ) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile ;
+};
+template< >
+struct synthesize_impl_o< 3425, 1, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::make_type_3425_1_20
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+namespace aux {
+
+template< bool C_, typename T1, typename T2, typename T3, typename T4 >
+struct and_impl
+ : false_
+{
+};
+
+template< typename T1, typename T2, typename T3, typename T4 >
+struct and_impl< true,T1,T2,T3,T4 >
+ : and_impl<
+ T1::type::value
+ , T2, T3, T4
+ , true_
+ >
+{
+};
+
+template<>
+struct and_impl<
+ true
+ , true_, true_, true_, true_
+ >
+ : true_
+{
+};
+
+}
+
+template<
+ typename T1 = na
+ , typename T2 = na
+ , typename T3 = true_, typename T4 = true_, typename T5 = true_
+ >
+struct and_
+
+ : aux::and_impl<
+ T1::type::value
+ , T2, T3, T4, T5
+ >
+
+{
+};
+
+template<> struct and_< na , na > { template< typename T1 , typename T2 , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : and_< T1 , T2 > { }; }; template< typename Tag > struct lambda< and_< na , na > , Tag > { typedef false_ is_le; typedef and_< na , na > result_; typedef and_< na , na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename T = na
+ >
+struct is_sequence
+ : not_< is_same< typename begin<T>::type, void_ > >
+{
+
+};
+
+
+
+
+
+
+
+
+
+
+template<> struct is_sequence< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : is_sequence< T1 > { }; }; template< typename Tag > struct lambda< is_sequence< na > , Tag > { typedef false_ is_le; typedef is_sequence< na > result_; typedef is_sequence< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_callable_builtin
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag, detail::callable_builtin_tag>
+ >
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+namespace boost { namespace function_types { namespace detail {
+
+
+template<typename T>
+struct to_sequence
+{
+ typedef typename
+ mpl::eval_if
+ < is_callable_builtin<T>
+ , to_sequence< components<T> >
+ , mpl::identity< T >
+ >::type
+ type;
+};
+
+
+
+template<typename T, typename U>
+struct to_sequence< components<T,U> >
+{
+ typedef typename components<T,U>::types type;
+};
+
+
+} } }
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types, typename Tag = null_tag> struct function_type
+ : detail::synthesize_func<typename detail::to_sequence<Types>::type, Tag>
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+struct blank;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template< typename From, typename To > struct is_convertible : public ::boost::integral_constant<bool,((__is_convertible_to(From,To) || is_same<From,To>::value) && !__is_abstract(To))> { public: };
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template <typename T>
+struct is_class_impl
+{
+ static const bool value = __is_class(T);
+};
+
+
+}
+
+
+
+
+
+template< typename T > struct is_class : public ::boost::integral_constant<bool,::boost::detail::is_class_impl<T>::value> { public: };
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+
+
+
+#pragma warning(push)
+#pragma warning(disable:4624)
+
+
+template <typename T>
+struct empty_helper_t1 : public T
+{
+ empty_helper_t1();
+ int i[256];
+private:
+
+ empty_helper_t1(const empty_helper_t1&);
+ empty_helper_t1& operator=(const empty_helper_t1&);
+};
+
+
+#pragma warning(pop)
+
+
+struct empty_helper_t2 { int i[256]; };
+
+
+
+template <typename T, bool is_a_class = false>
+struct empty_helper
+{
+ static const bool value = false;
+};
+
+template <typename T>
+struct empty_helper<T, true>
+{
+ static const bool value = (sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2));
+};
+
+template <typename T>
+struct is_empty_impl
+{
+ typedef typename remove_cv<T>::type cvt;
+ static const bool value = ( ::boost::type_traits::ice_or< ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value , false >::value );
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<> struct is_empty_impl< void > { public: static const bool value = (false); };
+
+template<> struct is_empty_impl< void const > { public: static const bool value = (false); };
+template<> struct is_empty_impl< void volatile > { public: static const bool value = (false); };
+template<> struct is_empty_impl< void const volatile > { public: static const bool value = (false); };
+
+
+}
+
+template< typename T > struct is_empty : public ::boost::integral_constant<bool,::boost::detail::is_empty_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct has_trivial_ctor_impl
+{
+
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_pod<T>::value, __has_trivial_constructor(T) >::value);
+
+
+
+
+
+
+
+};
+
+}
+
+template< typename T > struct has_trivial_constructor : public ::boost::integral_constant<bool,::boost::detail::has_trivial_ctor_impl<T>::value> { public: };
+template< typename T > struct has_trivial_default_constructor : public ::boost::integral_constant<bool,::boost::detail::has_trivial_ctor_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+namespace detail {
+
+template <typename T>
+struct is_stateless_impl
+{
+ static const bool value = (::boost::type_traits::ice_and< ::boost::has_trivial_constructor<T>::value, ::boost::has_trivial_copy<T>::value, ::boost::has_trivial_destructor<T>::value, ::boost::is_class<T>::value, ::boost::is_empty<T>::value >::value);
+};
+
+}
+
+template< typename T > struct is_stateless : public ::boost::integral_constant<bool,::boost::detail::is_stateless_impl<T>::value> { public: };
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+struct blank
+{
+};
+
+
+
+
+template <>
+struct is_pod< blank >
+ : mpl::true_
+{
+};
+
+template <>
+struct is_empty< blank >
+ : mpl::true_
+{
+};
+
+template <>
+struct is_stateless< blank >
+ : mpl::true_
+{
+};
+
+
+
+
+inline bool operator==(const blank&, const blank&)
+{
+ return true;
+}
+
+inline bool operator<=(const blank&, const blank&)
+{
+ return true;
+}
+
+inline bool operator>=(const blank&, const blank&)
+{
+ return true;
+}
+
+inline bool operator!=(const blank&, const blank&)
+{
+ return false;
+}
+
+inline bool operator<(const blank&, const blank&)
+{
+ return false;
+}
+
+inline bool operator>(const blank&, const blank&)
+{
+ return false;
+}
+
+
+
+
+
+template < typename E , typename T >
+inline std::basic_ostream< E , T >& operator<<(
+ std::basic_ostream< E , T >& out
+ , const blank&
+ )
+{
+
+ return out;
+}
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+
+
+template< typename Tag >
+struct pop_front_impl
+{
+ template< typename Sequence > struct apply
+
+
+
+
+
+
+
+ ;
+};
+
+ template<> struct pop_front_impl<non_sequence_tag> {};
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace mpl {
+
+template<
+ typename Sequence = na
+ >
+struct pop_front
+ : pop_front_impl< typename sequence_tag<Sequence>::type >
+ ::template apply< Sequence >
+{
+
+};
+
+template<> struct pop_front< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : pop_front< T1 > { }; }; template< typename Tag > struct lambda< pop_front< na > , Tag > { typedef false_ is_le; typedef pop_front< na > result_; typedef pop_front< na > type; };
+
+}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ using mpl::placeholders::_;
+
+ template< typename T, typename ClassTypeTransform = add_reference<_> >
+ struct parameter_types;
+
+ namespace detail
+ {
+ template<typename T, typename ClassTypeTransform>
+ struct parameter_types_impl
+ : mpl::pop_front
+ < typename function_types::components<T,ClassTypeTransform>::types
+ >::type
+ { };
+ }
+
+ template<typename T, typename ClassTypeTransform> struct parameter_types
+ : mpl::if_
+ < function_types::is_callable_builtin<T>
+ , detail::parameter_types_impl<T,ClassTypeTransform>, boost::blank
+ >::type
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T > struct result_type;
+
+ namespace detail
+ {
+ template<typename T> struct result_type_impl
+ : mpl::at_c
+ < typename function_types::components<T>::types, 0 >
+ { };
+ }
+
+ template<typename T> struct result_type
+ : mpl::if_
+ < function_types::is_callable_builtin<T>
+ , detail::result_type_impl<T>, boost::blank
+ >::type
+ {
+
+ };
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+namespace detail{
+
+
+
+
+
+
+
+
+ template <class T>
+ struct remove_pointer_imp
+ {
+ typedef T type;
+ };
+
+ template <class T>
+ struct remove_pointer_imp<T*>
+ {
+ typedef T type;
+ };
+
+ template <class T, bool b>
+ struct remove_pointer_imp3
+ {
+ typedef typename remove_pointer_imp<typename boost::remove_cv<T>::type>::type type;
+ };
+
+ template <class T>
+ struct remove_pointer_imp3<T, false>
+ {
+ typedef T type;
+ };
+
+ template <class T>
+ struct remove_pointer_imp2
+ {
+ typedef typename remove_pointer_imp3<T, ::boost::is_pointer<T>::value>::type type;
+ };
+}
+
+template< typename T > struct remove_pointer { public: typedef typename boost::detail::remove_pointer_imp2<T>::type type; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace type_traits {
+
+
+
+no_type __cdecl is_function_ptr_tester(...);
+
+
+
+
+
+template <class R >
+yes_type is_function_ptr_tester(R (*)());
+
+template <class R >
+yes_type is_function_ptr_tester(R (*)( ...));
+
+
+template <class R >
+yes_type is_function_ptr_tester(R (__stdcall*)());
+template <class R >
+yes_type is_function_ptr_tester(R (__stdcall*)( ...));
+
+template <class R >
+yes_type is_function_ptr_tester(R (__fastcall*)());
+template <class R >
+yes_type is_function_ptr_tester(R (__fastcall*)( ...));
+
+template <class R >
+yes_type is_function_ptr_tester(R (__cdecl*)());
+template <class R >
+yes_type is_function_ptr_tester(R (__cdecl*)( ...));
+
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (*)( T0));
+
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (*)( T0 ...));
+
+
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0));
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 ...));
+
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0));
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 ...));
+
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0));
+template <class R , class T0 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 ...));
+
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1));
+
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 ...));
+
+
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1));
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 ...));
+
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1));
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 ...));
+
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1));
+template <class R , class T0 , class T1 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 ...));
+
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2));
+
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 ...));
+
+
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2));
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 ...));
+
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2));
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 ...));
+
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2));
+template <class R , class T0 , class T1 , class T2 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3));
+
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3));
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3));
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3));
+template <class R , class T0 , class T1 , class T2 , class T3 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >
+yes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));
+
+
+
+
+
+
+
+
+
+}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+
+
+
+namespace detail {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template <typename T>
+struct is_function_impl
+{
+
+#pragma warning(push)
+#pragma warning(disable:6334)
+
+ static T* t;
+ static const bool value = sizeof(::boost::type_traits::is_function_ptr_tester(t)) == sizeof(::boost::type_traits::yes_type);
+
+#pragma warning(pop)
+
+};
+
+
+template <typename T>
+struct is_function_impl<T&> : public false_type
+{};
+
+
+
+
+}
+
+
+
+
+
+
+template< typename T > struct is_function : public ::boost::integral_constant<bool,::boost::detail::is_function_impl<T>::value> { public: };
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost
+{
+ namespace type_of
+ {
+
+
+
+ template<int N> struct the_counter;
+
+ template<typename T,int N = 5>
+ struct encode_counter
+ {
+ __if_exists(the_counter<N + 256>)
+ {
+ static const unsigned count=(encode_counter<T,N + 257>::count);
+ }
+ __if_not_exists(the_counter<N + 256>)
+ {
+ __if_exists(the_counter<N + 64>)
+ {
+ static const unsigned count=(encode_counter<T,N + 65>::count);
+ }
+ __if_not_exists(the_counter<N + 64>)
+ {
+ __if_exists(the_counter<N + 16>)
+ {
+ static const unsigned count=(encode_counter<T,N + 17>::count);
+ }
+ __if_not_exists(the_counter<N + 16>)
+ {
+ __if_exists(the_counter<N + 4>)
+ {
+ static const unsigned count=(encode_counter<T,N + 5>::count);
+ }
+ __if_not_exists(the_counter<N + 4>)
+ {
+ __if_exists(the_counter<N>)
+ {
+ static const unsigned count=(encode_counter<T,N + 1>::count);
+ }
+ __if_not_exists(the_counter<N>)
+ {
+ static const unsigned count=N;
+ typedef the_counter<N> type;
+ }
+ }
+ }
+ }
+ }
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ struct msvc_extract_type_default_param {};
+
+ template<typename ID, typename T = msvc_extract_type_default_param>
+ struct msvc_extract_type;
+
+ template<typename ID>
+ struct msvc_extract_type<ID, msvc_extract_type_default_param> {
+ template<bool>
+ struct id2type_impl;
+
+ typedef id2type_impl<true> id2type;
+ };
+
+ template<typename ID, typename T>
+ struct msvc_extract_type : msvc_extract_type<ID,msvc_extract_type_default_param>
+ {
+ template<>
+ struct id2type_impl<true>
+ {
+ typedef T type;
+ };
+ template<bool>
+ struct id2type_impl;
+
+ typedef id2type_impl<true> id2type;
+ };
+
+ template<typename T, typename ID>
+ struct msvc_register_type : msvc_extract_type<ID, T>
+ {
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template<int ID>
+ struct msvc_typeid_wrapper {
+ typedef typename msvc_extract_type<mpl::int_<ID> >::id2type id2type;
+ typedef typename id2type::type type;
+ };
+
+ template<>
+ struct msvc_typeid_wrapper<1> {
+ typedef msvc_typeid_wrapper<1> type;
+ };
+
+ template<>
+ struct msvc_typeid_wrapper<4> {
+ typedef msvc_typeid_wrapper<4> type;
+ };
+
+
+ template<typename T>
+ struct encode_type
+ {
+
+ static const unsigned value=(encode_counter<T>::count);
+
+ typedef typename msvc_register_type<T,mpl::int_<value> >::id2type type;
+
+ static const unsigned next=value+1;
+
+ ;
+ };
+
+ template<class T>
+ struct sizer
+ {
+ typedef char(*type)[encode_type<T>::value];
+ };
+
+ template<typename T> typename disable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T const&);
+
+ template<typename T> typename enable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T&);
+
+
+
+
+ template<typename Organizer, typename T>
+ msvc_register_type<T,Organizer> typeof_register_type(const T&,Organizer* =0);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace functional { namespace detail {
+
+
+
+
+template<typename F>
+class functor_type {
+ typedef typename boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(&(F::operator())))>::type call_ptr;
+public:
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front<
+ typename boost::function_types::parameter_types<
+ call_ptr>::type
+ >::type
+ , typename boost::function_types::result_type<call_ptr>::type
+ >::type
+ >::type
+ type;
+};
+
+
+
+template<typename F>
+struct function_type {
+ typedef
+ typename boost::mpl::if_<boost::function_types::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_pointer<F>,
+ boost::remove_pointer<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_reference<F>,
+ boost::remove_reference<F>
+ ,
+ functor_type<F>
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+} } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace functional {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename F0 , typename F1 , typename F2 = void , typename F3 = void , typename F4 = void
+>
+class overload
+
+
+
+
+
+ : public ::boost::functional::detail::overload_base< F0 > , public ::boost::functional::detail::overload_base< F1 > , public ::boost::functional::detail::overload_base< F2 > , public ::boost::functional::detail::overload_base< F3 > , public ::boost::functional::detail::overload_base< F4 >
+{
+public:
+ template<
+ typename G0 , typename G1 , typename G2 , typename G3 , typename G4
+ > inline overload(
+ G0 g0 , G1 g1 , G2 g2 , G3 g3 , G4 g4)
+
+ : ::boost::functional::detail::overload_base< F0 >( g0) , ::boost::functional::detail::overload_base< F1 >( g1) , ::boost::functional::detail::overload_base< F2 >( g2) , ::boost::functional::detail::overload_base< F3 >( g3) , ::boost::functional::detail::overload_base< F4 >( g4)
+ {}
+
+ using ::boost::functional::detail::overload_base< F0 >::operator(); using ::boost::functional::detail::overload_base< F1 >::operator(); using ::boost::functional::detail::overload_base< F2 >::operator(); using ::boost::functional::detail::overload_base< F3 >::operator(); using ::boost::functional::detail::overload_base< F4 >::operator();
+};
+
+template<
+ typename F0 , typename F1 , typename F2 , typename F3 , typename F4
+>
+overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type , typename detail::function_type< F3 >::type , typename detail::function_type< F4 >::type
+> make_overload(
+ F0 f0 , F1 f1 , F2 f2 , F3 f3 , F4 f4
+) {
+ return overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type , typename detail::function_type< F3 >::type , typename detail::function_type< F4 >::type
+ >( f0 , f1 , f2 , f3 , f4);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename F0 , typename F1 , typename F2 , typename F3
+>
+class overload
+
+ <
+ F0 , F1 , F2 , F3
+ >
+
+ : public ::boost::functional::detail::overload_base< F0 > , public ::boost::functional::detail::overload_base< F1 > , public ::boost::functional::detail::overload_base< F2 > , public ::boost::functional::detail::overload_base< F3 >
+{
+public:
+ template<
+ typename G0 , typename G1 , typename G2 , typename G3
+ > inline overload(
+ G0 g0 , G1 g1 , G2 g2 , G3 g3)
+
+ : ::boost::functional::detail::overload_base< F0 >( g0) , ::boost::functional::detail::overload_base< F1 >( g1) , ::boost::functional::detail::overload_base< F2 >( g2) , ::boost::functional::detail::overload_base< F3 >( g3)
+ {}
+
+ using ::boost::functional::detail::overload_base< F0 >::operator(); using ::boost::functional::detail::overload_base< F1 >::operator(); using ::boost::functional::detail::overload_base< F2 >::operator(); using ::boost::functional::detail::overload_base< F3 >::operator();
+};
+
+template<
+ typename F0 , typename F1 , typename F2 , typename F3
+>
+overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type , typename detail::function_type< F3 >::type
+> make_overload(
+ F0 f0 , F1 f1 , F2 f2 , F3 f3
+) {
+ return overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type , typename detail::function_type< F3 >::type
+ >( f0 , f1 , f2 , f3);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename F0 , typename F1 , typename F2
+>
+class overload
+
+ <
+ F0 , F1 , F2
+ >
+
+ : public ::boost::functional::detail::overload_base< F0 > , public ::boost::functional::detail::overload_base< F1 > , public ::boost::functional::detail::overload_base< F2 >
+{
+public:
+ template<
+ typename G0 , typename G1 , typename G2
+ > inline overload(
+ G0 g0 , G1 g1 , G2 g2)
+
+ : ::boost::functional::detail::overload_base< F0 >( g0) , ::boost::functional::detail::overload_base< F1 >( g1) , ::boost::functional::detail::overload_base< F2 >( g2)
+ {}
+
+ using ::boost::functional::detail::overload_base< F0 >::operator(); using ::boost::functional::detail::overload_base< F1 >::operator(); using ::boost::functional::detail::overload_base< F2 >::operator();
+};
+
+template<
+ typename F0 , typename F1 , typename F2
+>
+overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type
+> make_overload(
+ F0 f0 , F1 f1 , F2 f2
+) {
+ return overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type , typename detail::function_type< F2 >::type
+ >( f0 , f1 , f2);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+template<
+ typename F0 , typename F1
+>
+class overload
+
+ <
+ F0 , F1
+ >
+
+ : public ::boost::functional::detail::overload_base< F0 > , public ::boost::functional::detail::overload_base< F1 >
+{
+public:
+ template<
+ typename G0 , typename G1
+ > inline overload(
+ G0 g0 , G1 g1)
+
+ : ::boost::functional::detail::overload_base< F0 >( g0) , ::boost::functional::detail::overload_base< F1 >( g1)
+ {}
+
+ using ::boost::functional::detail::overload_base< F0 >::operator(); using ::boost::functional::detail::overload_base< F1 >::operator();
+};
+
+template<
+ typename F0 , typename F1
+>
+overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type
+> make_overload(
+ F0 f0 , F1 f1
+) {
+ return overload<
+ typename detail::function_type< F0 >::type , typename detail::function_type< F1 >::type
+ >( f0 , f1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost { namespace functional {
+
+namespace detail {
+
+
+template<typename F>
+class functor_type {
+ typedef typename boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(&(F::operator())))>::type call_ptr;
+public:
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front<
+ typename boost::function_types::parameter_types<
+ call_ptr>::type
+ >::type
+ , typename boost::function_types::result_type<call_ptr>::type
+ >::type
+ >::type
+ type;
+};
+
+
+template<typename F>
+struct function_type {
+ typedef
+ typename boost::mpl::if_<boost::function_types::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_pointer<F>,
+ boost::remove_pointer<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_reference<F>,
+ boost::remove_reference<F>
+ ,
+ functor_type<F>
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+}
+
+
+template<typename F0, typename F1, typename F2>
+overload<
+ typename detail::function_type<F0>::type
+ , typename detail::function_type<F1>::type
+ , typename detail::function_type<F2>::type
+> make_overload(F0 f0, F1 f1, F2 f2) {
+ return overload<
+ typename detail::function_type<F0>::type
+ , typename detail::function_type<F1>::type
+ , typename detail::function_type<F2>::type
+ >(f0, f1, f2);
+}
+
+} }
+
+template<typename F>
+void call(F print) {
+ print("abc");
+ print(123);
+ print(1.23);
+}
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d_impl(double d) { std::cout << d << std::endl; }
+boost::function<void (double)> print_d = print_d_impl;
+
+int main(void) {
+ print_s("abc");
+ print_i(123);
+ print_d(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, print_d);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(boost::functional::make_overload(print_s, print_i, print_d)))>::type p = boost::functional::make_overload(print_s, print_i, print_d);
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ call(boost::functional::make_overload(print_s, print_i, print_d));
+ return 0;
+}
+

Added: sandbox/closure/01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,8 @@
+
+#define IF_1(then_, else_) then_
+#define IF_0(then_, else_) else_
+#define IF(cond, then_, else_) IF_ ## cond (then_, else_)
+
+IF(1, true, false)
+IF(0, true, false)
+

Added: sandbox/closure/02.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/02.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,14 @@
+
+#include <boost/preprocessor.hpp>
+
+#define SCOPE_EXIT_THIS(unused) (~)
+
+#define IS_THIS_(tokens) \
+ BOOST_PP_IS_UNARY( tokens (~) )
+
+IS_THIS_( & ) // 0
+IS_THIS_( = ) // 0
+IS_THIS_( &r ) // 0
+IS_THIS_( v ) // 0
+IS_THIS_( SCOPE_EXIT_THIS ) // 1
+

Added: sandbox/closure/03.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/03.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,153 @@
+
+#include <boost/closure/detail/preprocessor/keyword/void.hpp>
+#include <boost/closure/detail/preprocessor/keyword/thisunderscore.hpp>
+#include <boost/preprocessor.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+////////////////////////////////////////////////////////////////////////////
+
+// Argument: (token1)...
+#define TO_LIST_FROM_SEQ_(unused, seq) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_SEQ_SIZE(seq), BOOST_PP_SEQ_TO_TUPLE(seq))
+
+// Token: void | token1
+#define TO_LIST_HANDLE_VOID_(is_void_macro, token) \
+ /* REM to properly handle empty on MSVC, IS_BACK for leading symbols */ \
+ BOOST_PP_IIF(is_void_macro(token), \
+ BOOST_PP_NIL \
+ , \
+ (token, BOOST_PP_NIL) \
+ )
+
+// Token: (a)(b)... | empty | void | token
+#define TO_LIST_HANDLE_SEQ_(is_void_macro, token) \
+ /* REM to properly handle empty on MSVC */ \
+ BOOST_PP_IIF(BOOST_PP_IS_UNARY(token), \
+ TO_LIST_FROM_SEQ_ \
+ , \
+ TO_LIST_HANDLE_VOID_ \
+ )(is_void_macro, token)
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+
+#define TO_LIST(is_void_macro, seq) \
+ TO_LIST_HANDLE_SEQ_(is_void_macro, seq)
+
+#else // variadic
+
+// Argument: token1, ...
+#define TO_LIST_FROM_VARIADIC_(unused, ...) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__))
+
+#define TO_LIST(is_void_macro, ...) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
+ TO_LIST_HANDLE_SEQ_ \
+ , \
+ TO_LIST_FROM_VARIADIC_ \
+ )(is_void_macro, __VA_ARGS__)
+
+#endif // variadic
+
+///////////////////////////////////////////////////////////////////////////
+
+#define TRAITS_THIS_(d, binds, this01, this_) \
+ (binds, 1 /* has this */)
+
+#define TRAITS_BIND_(d, binds, this01, bind) \
+ (BOOST_PP_LIST_APPEND(binds, (bind, BOOST_PP_NIL)), this01)
+
+#define TRAITS_(d, binds_this, bind) \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(bind), \
+ TRAITS_THIS_ \
+ , \
+ TRAITS_BIND_ \
+ )(d, BOOST_PP_TUPLE_ELEM(2, 0, binds_this), \
+ BOOST_PP_TUPLE_ELEM(2, 1, binds_this), bind)
+
+#define TRAITS_ALL_(ref_val, traits) \
+ ( \
+ BOOST_PP_LIST_APPEND((ref_val, BOOST_PP_NIL), TRAITS_BINDS(traits)) \
+ , \
+ TRAITS_HAS_THIS(traits) \
+ )
+
+#define TRAITS(binds) \
+ BOOST_PP_LIST_FOLD_LEFT(TRAITS_, (BOOST_PP_NIL, 0), binds)
+
+#define TRAITS_ALL(binds) \
+ TRAITS_ALL_(BOOST_PP_LIST_FIRST(binds), TRAITS(BOOST_PP_LIST_REST(binds)))
+
+#define TRAITS_BINDS(traits) BOOST_PP_TUPLE_ELEM(2, 0, traits)
+
+#define TRAITS_HAS_THIS(traits) BOOST_PP_TUPLE_ELEM(2, 1, traits)
+
+////////////////////////////////////////////////////////////////////////////
+
+#define SCOPE_EXIT_AUX(id, typename01, binds, has_this_) \
+ BOOST_PP_EXPR_IIF(has_this_, \
+ BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS(BOOST_PP_CAT( \
+ bost_se_this_type_, id)) \
+ ) \
+ ::boost::scope_exit::aux::guard BOOST_PP_CAT(boost_se_guard_, id) = \
+ [BOOST_PP_LIST_ENUM(binds)]() mutable -> void \
+ { \
+ };
+
+#define IS_THIS_(d, data, bind) \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(bind)
+
+#define SCOPE_EXIT_(typename01, binds) \
+ SCOPE_EXIT_AUX(__LINE__, typename01, binds, BOOST_PP_LIST_IS_CONS( \
+ BOOST_PP_LIST_FILTER(IS_THIS_, ~, binds)))
+
+#define SCOPE_EXIT_ALL_(typename01, binds) \
+ SCOPE_EXIT_AUX(__LINE__, typename01, binds, BOOST_PP_LIST_IS_CONS( \
+ BOOST_PP_LIST_FILTER(IS_THIS_, ~, BOOST_PP_LIST_REST(binds))))
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT(seq) \
+ SCOPE_EXIT_(0 /* no typename */, TO_LIST( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, seq))
+#else
+# define SCOPE_EXIT(...) \
+ SCOPE_EXIT_(0 /* no typename */, TO_LIST( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, __VA_ARGS__))
+#endif
+
+#define NEVER_VOID_(tokens) 0 /* always false */
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT_ALL(seq) \
+ SCOPE_EXIT_ALL_(0 /* no typename */, TO_LIST(NEVER_VOID_, seq))
+#else
+# define SCOPE_EXIT_ALL(...) \
+ SCOPE_EXIT_ALL_(0 /* no typename */, TO_LIST(NEVER_VOID_, __VA_ARGS__))
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+
+//SCOPE_EXIT( ) // no because IS_EMPTY(&r) fails :(
+SCOPE_EXIT( void )
+SCOPE_EXIT( &r )
+
+SCOPE_EXIT( (&r) (v) (this_) )
+SCOPE_EXIT( (&r) (v) (this) ) // C++11 only
+
+SCOPE_EXIT_ALL( & ) // C++11 only
+SCOPE_EXIT_ALL( = ) // C++11 only
+
+SCOPE_EXIT_ALL( (&) ) // C++11 only
+SCOPE_EXIT_ALL( (=) ) // C++11 only
+SCOPE_EXIT_ALL( (&) (v) (this_) ) // C++11 only
+SCOPE_EXIT_ALL( (=) (&r) (this) ) // C++11 only
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+SCOPE_EXIT( &r, v, this_ )
+SCOPE_EXIT( &r, v, this ) // C++11 only
+
+SCOPE_EXIT_ALL( &, v, this_ ) // C++11 only
+SCOPE_EXIT_ALL( =, &r, this ) // C++11 only
+
+#endif
+

Added: sandbox/closure/04.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/04.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,173 @@
+
+#include <boost/closure/detail/preprocessor/keyword/void.hpp>
+#include <boost/closure/detail/preprocessor/keyword/thisunderscore.hpp>
+#include <boost/preprocessor.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+////////////////////////////////////////////////////////////////////////////
+
+// Argument: (token1)...
+#define TO_LIST_FROM_SEQ_(unused, seq) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_SEQ_SIZE(seq), BOOST_PP_SEQ_TO_TUPLE(seq))
+
+// Token: void | token1
+#define TO_LIST_HANDLE_VOID_(is_void_macro, token) \
+ /* REM to properly handle empty on MSVC, IS_BACK for leading symbols */ \
+ BOOST_PP_IIF(is_void_macro(token), \
+ BOOST_PP_NIL \
+ , \
+ (token, BOOST_PP_NIL) \
+ )
+
+// Token: (a)(b)... | empty | void | token
+#define TO_LIST_HANDLE_SEQ_(is_void_macro, token) \
+ /* REM to properly handle empty on MSVC */ \
+ BOOST_PP_IIF(BOOST_PP_IS_UNARY(token), \
+ TO_LIST_FROM_SEQ_ \
+ , \
+ TO_LIST_HANDLE_VOID_ \
+ )(is_void_macro, token)
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+
+#define TO_LIST(is_void_macro, seq) \
+ TO_LIST_HANDLE_SEQ_(is_void_macro, seq)
+
+#else // variadic
+
+// Argument: token1, ...
+#define TO_LIST_FROM_VARIADIC_(unused, ...) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__))
+
+#define TO_LIST(is_void_macro, ...) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
+ TO_LIST_HANDLE_SEQ_ \
+ , \
+ TO_LIST_FROM_VARIADIC_ \
+ )(is_void_macro, __VA_ARGS__)
+
+#endif // variadic
+
+///////////////////////////////////////////////////////////////////////////
+
+#define TRAITS_THIS_(d, binds, this01, this_) \
+ (binds, 1 /* has this */)
+
+#define TRAITS_BIND_(d, binds, this01, bind) \
+ (BOOST_PP_LIST_APPEND(binds, (bind, BOOST_PP_NIL)), this01)
+
+#define TRAITS_(d, binds_this, bind) \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(bind), \
+ TRAITS_THIS_ \
+ , \
+ TRAITS_BIND_ \
+ )(d, BOOST_PP_TUPLE_ELEM(2, 0, binds_this), \
+ BOOST_PP_TUPLE_ELEM(2, 1, binds_this), bind)
+
+#define TRAITS_ALL_(ref_val, traits) \
+ ( \
+ BOOST_PP_LIST_APPEND((ref_val, BOOST_PP_NIL), TRAITS_BINDS(traits)) \
+ , \
+ TRAITS_HAS_THIS(traits) \
+ )
+
+#define TRAITS(binds) \
+ BOOST_PP_LIST_FOLD_LEFT(TRAITS_, (BOOST_PP_NIL, 0), binds)
+
+#define TRAITS_ALL(binds) \
+ TRAITS_ALL_(BOOST_PP_LIST_FIRST(binds), TRAITS(BOOST_PP_LIST_REST(binds)))
+
+#define TRAITS_BINDS(traits) BOOST_PP_TUPLE_ELEM(2, 0, traits)
+
+#define TRAITS_HAS_THIS(traits) BOOST_PP_TUPLE_ELEM(2, 1, traits)
+
+////////////////////////////////////////////////////////////////////////////
+
+template<typename This = void>
+struct guard {
+ explicit guard(This _this) : this_(_this) {}
+ ~guard() { if(f_) f_(this_); }
+ template<typename Lambda>
+ void operator=(Lambda f) { f_ = f; }
+private:
+ This this_;
+ boost::function<void (This)> f_;
+};
+
+template<>
+struct guard<void> {
+ ~guard() { if(f_) f_(); }
+ template<typename Lambda>
+ void operator=(Lambda f_) { f_ = f; }
+private:
+ boost::functon<void (void)> f_;
+};
+
+#define SCOPE_EXIT_AUX_GUARD_(id) \
+ BOOST_PP_CAT(boost_se_guard_, id)
+
+#define SCOPE_EXIT_AUX(id, typename01, traits) \
+ guard< \
+ BOOST_PP_EXPR_IIF(TRAITS_HAS_THIS(traits), \
+ BOOST_TYPEOF(this) \
+ ) \
+ > SCOPE_EXIT_AUX_GUARD_(id)( \
+ BOOST_PP_EXPR_IIF(TRAITS_HAS_THIS(traits), \
+ this \
+ ) \
+ ); \
+ SCOPE_EXIT_AUX_GUARD_(id) = [ BOOST_PP_LIST_ENUM(TRAITS_BINDS(traits)) ]( \
+ BOOST_PP_EXPR_IIF(TRAITS_HAS_THIS(traits), \
+ BOOST_TYPEOF(this) this_ \
+ ) \
+ ) mutable -> void
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT(seq) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, TRAITS(TO_LIST( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, seq)))
+#else
+# define SCOPE_EXIT(...) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, TRAITS(TO_LIST( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, __VA_ARGS__)))
+#endif
+
+#define NEVER_VOID_(tokens) 0 /* always false */
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT_ALL(seq) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, TRAITS_ALL(TO_LIST( \
+ NEVER_VOID_, seq)))
+#else
+# define SCOPE_EXIT_ALL(...) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, TRAITS_ALL(TO_LIST( \
+ NEVER_VOID_, __VA_ARGS__)))
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+
+//SCOPE_EXIT( ) // no because IS_EMPTY(&r) fails :(
+SCOPE_EXIT( void )
+SCOPE_EXIT( &r )
+
+SCOPE_EXIT( (&r) (v) (this_) )
+SCOPE_EXIT( (&r) (v) (this) ) // C++11 only
+
+SCOPE_EXIT_ALL( & ) // C++11 only
+SCOPE_EXIT_ALL( = ) // C++11 only
+
+SCOPE_EXIT_ALL( (&) ) // C++11 only
+SCOPE_EXIT_ALL( (=) ) // C++11 only
+SCOPE_EXIT_ALL( (&) (v) (this_) ) // C++11 only
+SCOPE_EXIT_ALL( (=) (&r) (this) ) // C++11 only
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+SCOPE_EXIT( &r, v, this_ )
+SCOPE_EXIT( &r, v, this ) // C++11 only
+
+SCOPE_EXIT_ALL( &, v, this_ ) // C++11 only
+SCOPE_EXIT_ALL( =, &r, this ) // C++11 only
+
+#endif
+

Added: sandbox/closure/05.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/05.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,135 @@
+
+#include <boost/closure/detail/preprocessor/keyword/void.hpp>
+#include <boost/closure/detail/preprocessor/keyword/thisunderscore.hpp>
+#include <boost/preprocessor.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+///////////////////////////////////////////////////////////////////////////
+
+#define SCOPE_EXIT_AUX_TRAITS_THIS_(d, binds, this01, this_) \
+ (binds, 1 /* has this */)
+
+#define SCOPE_EXIT_AUX_TRAITS_BIND_(d, binds, this01, bind) \
+ (BOOST_PP_LIST_APPEND(binds, (bind, BOOST_PP_NIL)), this01)
+
+#define SCOPE_EXIT_AUX_TRAITS_(d, binds_this, bind) \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK(bind), \
+ SCOPE_EXIT_AUX_TRAITS_THIS_ \
+ , \
+ SCOPE_EXIT_AUX_TRAITS_BIND_ \
+ )(d, BOOST_PP_TUPLE_ELEM(2, 0, binds_this), \
+ BOOST_PP_TUPLE_ELEM(2, 1, binds_this), bind)
+
+#define SCOPE_EXIT_AUX_TRAITS_ALL_(ref_val, traits) \
+ ( \
+ BOOST_PP_LIST_APPEND((ref_val, BOOST_PP_NIL), \
+ SCOPE_EXIT_AUX_TRAITS_BINDS(traits)) \
+ , \
+ SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits) \
+ )
+
+#define SCOPE_EXIT_AUX_TRAITS(binds) \
+ BOOST_PP_LIST_FOLD_LEFT(SCOPE_EXIT_AUX_TRAITS_, (BOOST_PP_NIL, 0), binds)
+
+#define SCOPE_EXIT_AUX_TRAITS_ALL(binds) \
+ SCOPE_EXIT_AUX_TRAITS_ALL_(BOOST_PP_LIST_FIRST(binds), \
+ SCOPE_EXIT_AUX_TRAITS(BOOST_PP_LIST_REST(binds)))
+
+#define SCOPE_EXIT_AUX_TRAITS_BINDS(traits) BOOST_PP_TUPLE_ELEM(2, 0, traits)
+
+#define SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits) BOOST_PP_TUPLE_ELEM(2, 1, traits)
+
+////////////////////////////////////////////////////////////////////////////
+
+template<typename This = void>
+struct guard {
+ explicit guard(This _this) : this_(_this) {}
+ ~guard() { if(f_) f_(this_); }
+ template<typename Lambda>
+ void operator=(Lambda f) { f_ = f; }
+private:
+ This this_;
+ boost::function<void (This)> f_;
+};
+
+template<>
+struct guard<void> {
+ ~guard() { if(f_) f_(); }
+ template<typename Lambda>
+ void operator=(Lambda f_) { f_ = f; }
+private:
+ boost::functon<void (void)> f_;
+};
+
+#define SCOPE_EXIT_AUX_GUARD_(id) \
+ BOOST_PP_CAT(boost_se_guard_, id)
+
+#define SCOPE_EXIT_AUX(id, typename01, traits) \
+ guard< \
+ BOOST_PP_EXPR_IIF(SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
+ BOOST_TYPEOF(this) \
+ ) \
+ > SCOPE_EXIT_AUX_GUARD_(id)( \
+ BOOST_PP_EXPR_IIF(SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
+ this \
+ ) \
+ ); \
+ SCOPE_EXIT_AUX_GUARD_(id) = [ \
+ BOOST_PP_LIST_ENUM(SCOPE_EXIT_AUX_TRAITS_BINDS(traits)) \
+ ]( \
+ BOOST_PP_EXPR_IIF(SCOPE_EXIT_AUX_TRAITS_HAS_THIS(traits), \
+ BOOST_TYPEOF(this) this_ \
+ ) \
+ ) mutable -> void
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT(seq) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, SCOPE_EXIT_AUX_TRAITS( \
+ SCOPE_EXIT_AUX_BINDS( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, seq)))
+#else
+# define SCOPE_EXIT(...) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, SCOPE_EXIT_AUX_TRAITS( \
+ SCOPE_EXIT_AUX_BINDS( \
+ BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_VOID_BACK, __VA_ARGS__)))
+#endif
+
+#ifdef BOOST_NO_VARIADIC_MACROS
+# define SCOPE_EXIT_ALL(seq) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, \
+ SCOPE_EXIT_AUX_TRAITS_ALL(SCOPE_EXIT_AUX_BINDS( \
+ SCOPE_EXIT_AUX_BINDS_NEVER_VOID, seq)))
+#else
+# define SCOPE_EXIT_ALL(...) \
+ SCOPE_EXIT_AUX(__LINE__, 0 /* no typename */, \
+ SCOPE_EXIT_AUX_TRAITS_ALL(SCOPE_EXIT_AUX_BINDS( \
+ SCOPE_EXIT_AUX_BINDS_NEVER_VOID, __VA_ARGS__)))
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+
+//SCOPE_EXIT( ) // no because IS_EMPTY(&r) fails :(
+SCOPE_EXIT( void )
+SCOPE_EXIT( &r )
+
+SCOPE_EXIT( (&r) (v) (this_) )
+SCOPE_EXIT( (&r) (v) (this) ) // C++11 only
+
+SCOPE_EXIT_ALL( & ) // C++11 only
+SCOPE_EXIT_ALL( = ) // C++11 only
+
+SCOPE_EXIT_ALL( (&) ) // C++11 only
+SCOPE_EXIT_ALL( (=) ) // C++11 only
+SCOPE_EXIT_ALL( (&) (v) (this_) ) // C++11 only
+SCOPE_EXIT_ALL( (=) (&r) (this) ) // C++11 only
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+SCOPE_EXIT( &r, v, this_ )
+SCOPE_EXIT( &r, v, this ) // C++11 only
+
+SCOPE_EXIT_ALL( &, v, this_ ) // C++11 only
+SCOPE_EXIT_ALL( =, &r, this ) // C++11 only
+
+#endif
+

Added: sandbox/closure/06.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/06.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,51 @@
+
+#include <boost/function.hpp>
+#include <iostream>
+
+template<typename This = void>
+struct guard {
+ explicit guard(This _this) : this_(_this) {}
+ template<typename Lambda>
+ void operator=(Lambda f) { f_ = f; }
+ ~guard() { if(f_) f_(this_); }
+private:
+ This this_;
+ boost::function<void (This)> f_;
+};
+
+template<>
+struct guard<void> {
+ template<typename Lambda>
+ void operator=(Lambda f) { f_ = f; }
+ ~guard() { if(f_) f_(); }
+private:
+ boost::function<void (void)> f_;
+};
+
+struct x {
+ void f() {
+ i_ = 30;
+ int r = -20, v = 20;
+ guard<x*> g(this); g = [&r, v](x* this_) mutable -> void {
+ r = v + this_->i_;
+ std::cout << r << " " << v << std::endl;
+ };
+ std::cout << r << " " << v << std::endl;
+ }
+private:
+ int i_;
+};
+
+int main() {
+ x xx;
+ xx.f();
+
+ int r = -10, v = 10;
+ guard<> g; g = [&r, v]() mutable -> void {
+ r = v;
+ std::cout << r << " " << v << std::endl;
+ };
+ std::cout << r << " " << v << std::endl;
+ return 0;
+}
+

Added: sandbox/closure/16.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/16.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,17973 @@
+
+typedef int ptrdiff_t;
+typedef unsigned int size_t;
+namespace std {
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+
+namespace std {
+ namespace rel_ops
+ {
+ template <class _Tp>
+ inline bool
+ operator!=(const _Tp& __x, const _Tp& __y)
+ { return !(__x == __y); }
+ template <class _Tp>
+ inline bool
+ operator>(const _Tp& __x, const _Tp& __y)
+ { return __y < __x; }
+ template <class _Tp>
+ inline bool
+ operator<=(const _Tp& __x, const _Tp& __y)
+ { return !(__y < __x); }
+ template <class _Tp>
+ inline bool
+ operator>=(const _Tp& __x, const _Tp& __y)
+ { return !(__x < __y); }
+ }
+}
+
+
+
+
+namespace std {
+ template<typename _Tp>
+ inline void
+ swap(_Tp& __a, _Tp& __b)
+ {
+
+ _Tp __tmp = (__a);
+ __a = (__b);
+ __b = (__tmp);
+ }
+ template<typename _Tp, size_t _Nm>
+ inline void
+ swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+ {
+ for (size_t __n = 0; __n < _Nm; ++__n)
+ swap(__a[__n], __b[__n]);
+ }
+}
+namespace std {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair()
+ : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ template<class _U1, class _U2>
+ pair(const pair<_U1, _U2>& __p)
+ : first(__p.first),
+ second(__p.second) { }
+ };
+ template<class _T1, class _T2>
+ inline bool
+ operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first == __y.first && __x.second == __y.second; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first < __y.first
+ || (!(__y.first < __x.first) && __x.second < __y.second); }
+ template<class _T1, class _T2>
+ inline bool
+ operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x == __y); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __y < __x; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__y < __x); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x < __y); }
+ template<class _T1, class _T2>
+ inline pair<_T1, _T2>
+ make_pair(_T1 __x, _T2 __y)
+ { return pair<_T1, _T2>(__x, __y); }
+}
+extern "C" {
+extern "C" {
+}
+extern "C" {
+}
+extern "C" {
+typedef signed char __int8_t ;
+typedef unsigned char __uint8_t ;
+typedef signed short __int16_t;
+typedef unsigned short __uint16_t;
+typedef __int16_t __int_least16_t;
+typedef __uint16_t __uint_least16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+typedef __int32_t __int_least32_t;
+typedef __uint32_t __uint_least32_t;
+typedef signed long long __int64_t;
+typedef unsigned long long __uint64_t;
+
+}
+typedef void *_LOCK_T;
+extern "C"
+{
+void __cygwin_lock_init(_LOCK_T *);
+void __cygwin_lock_init_recursive(_LOCK_T *);
+void __cygwin_lock_fini(_LOCK_T *);
+void __cygwin_lock_lock(_LOCK_T *);
+int __cygwin_lock_trylock(_LOCK_T *);
+void __cygwin_lock_unlock(_LOCK_T *);
+}
+typedef long _off_t;
+typedef short __dev_t;
+typedef unsigned short __uid_t;
+typedef unsigned short __gid_t;
+__extension__ typedef long long _off64_t;
+typedef long _fpos_t;
+typedef _off64_t _fpos64_t;
+typedef int _ssize_t;
+typedef unsigned int wint_t;
+typedef struct
+{
+ int __count;
+ union
+ {
+ wint_t __wch;
+ unsigned char __wchb[4];
+ } __value;
+} _mbstate_t;
+typedef _LOCK_T _flock_t;
+typedef void *_iconv_t;
+typedef long int __off_t;
+typedef int __pid_t;
+__extension__ typedef long long int __loff_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+typedef unsigned long clock_t;
+typedef long time_t;
+struct timespec {
+ time_t tv_sec;
+ long tv_nsec;
+};
+struct itimerspec {
+ struct timespec it_interval;
+ struct timespec it_value;
+};
+typedef long daddr_t;
+typedef char * caddr_t;
+
+typedef int pid_t;
+typedef _ssize_t ssize_t;
+typedef unsigned short nlink_t;
+typedef long fd_mask;
+typedef struct _types_fd_set {
+ fd_mask fds_bits[(((64)+(((sizeof (fd_mask) * 8))-1))/((sizeof (fd_mask) * 8)))];
+} _types_fd_set;
+typedef unsigned long clockid_t;
+typedef unsigned long timer_t;
+typedef unsigned long useconds_t;
+typedef long suseconds_t;
+extern "C"
+{
+typedef signed char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+typedef long long int64_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+typedef signed char int_least8_t;
+typedef short int_least16_t;
+typedef int int_least32_t;
+typedef long long int_least64_t;
+typedef unsigned char uint_least8_t;
+typedef unsigned short uint_least16_t;
+typedef unsigned int uint_least32_t;
+typedef unsigned long long uint_least64_t;
+typedef signed char int_fast8_t;
+typedef int int_fast16_t;
+typedef int int_fast32_t;
+typedef long long int_fast64_t;
+typedef unsigned char uint_fast8_t;
+typedef unsigned int uint_fast16_t;
+typedef unsigned int uint_fast32_t;
+typedef unsigned long long uint_fast64_t;
+typedef int intptr_t;
+typedef unsigned int uintptr_t;
+typedef long long intmax_t;
+typedef unsigned long long uintmax_t;
+extern "C" {
+static __inline unsigned short
+bswap_16 (unsigned short __x)
+{
+ return (__x >> 8) | (__x << 8);
+}
+static __inline unsigned int
+bswap_32 (unsigned int __x)
+{
+ return (bswap_16 (__x & 0xffff) << 16) | (bswap_16 (__x >> 16));
+}
+static __inline unsigned long long
+bswap_64 (unsigned long long __x)
+{
+ return (((unsigned long long) bswap_32 (__x & 0xffffffffull)) << 32) | (bswap_32 (__x >> 32));
+}
+}
+typedef struct timespec timespec_t;
+typedef struct timespec timestruc_t;
+typedef _off64_t off_t;
+typedef __loff_t loff_t;
+typedef short __dev16_t;
+typedef unsigned long __dev32_t;
+typedef __dev32_t dev_t;
+typedef long blksize_t;
+typedef long __blkcnt32_t;
+typedef long long __blkcnt64_t;
+typedef __blkcnt64_t blkcnt_t;
+typedef unsigned long fsblkcnt_t;
+typedef unsigned long fsfilcnt_t;
+typedef unsigned short __uid16_t;
+typedef unsigned long __uid32_t;
+typedef __uid32_t uid_t;
+typedef unsigned short __gid16_t;
+typedef unsigned long __gid32_t;
+typedef __gid32_t gid_t;
+typedef unsigned long __ino32_t;
+typedef unsigned long long __ino64_t;
+typedef __ino64_t ino_t;
+typedef unsigned long id_t;
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+typedef long long key_t;
+typedef unsigned long vm_offset_t;
+typedef unsigned long vm_size_t;
+typedef void *vm_object_t;
+typedef unsigned char u_int8_t;
+typedef __uint16_t u_int16_t;
+typedef __uint32_t u_int32_t;
+typedef __uint64_t u_int64_t;
+typedef __int32_t register_t;
+typedef char *addr_t;
+typedef unsigned mode_t;
+typedef struct __pthread_t {char __dummy;} *pthread_t;
+typedef struct __pthread_mutex_t {char __dummy;} *pthread_mutex_t;
+typedef struct __pthread_key_t {char __dummy;} *pthread_key_t;
+typedef struct __pthread_attr_t {char __dummy;} *pthread_attr_t;
+typedef struct __pthread_mutexattr_t {char __dummy;} *pthread_mutexattr_t;
+typedef struct __pthread_condattr_t {char __dummy;} *pthread_condattr_t;
+typedef struct __pthread_cond_t {char __dummy;} *pthread_cond_t;
+typedef struct
+{
+ pthread_mutex_t mutex;
+ int state;
+}
+pthread_once_t;
+typedef struct __pthread_rwlock_t {char __dummy;} *pthread_rwlock_t;
+typedef struct __pthread_rwlockattr_t {char __dummy;} *pthread_rwlockattr_t;
+}
+extern char **environ;
+void __attribute__((__cdecl__)) _exit (int __status ) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) access (const char *__path, int __amode );
+unsigned __attribute__((__cdecl__)) alarm (unsigned __secs );
+int __attribute__((__cdecl__)) chdir (const char *__path );
+int __attribute__((__cdecl__)) chmod (const char *__path, mode_t __mode );
+int __attribute__((__cdecl__)) chown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) chroot (const char *__path );
+int __attribute__((__cdecl__)) close (int __fildes );
+size_t __attribute__((__cdecl__)) confstr (int __name, char *__buf, size_t __len);
+char * __attribute__((__cdecl__)) ctermid (char *__s );
+char * __attribute__((__cdecl__)) cuserid (char *__s );
+int __attribute__((__cdecl__)) daemon (int nochdir, int noclose);
+int __attribute__((__cdecl__)) dup (int __fildes );
+int __attribute__((__cdecl__)) dup2 (int __fildes, int __fildes2 );
+int __attribute__((__cdecl__)) dup3 (int __fildes, int __fildes2, int flags);
+int __attribute__((__cdecl__)) eaccess (const char *__path, int __mode);
+void __attribute__((__cdecl__)) endusershell (void);
+int __attribute__((__cdecl__)) euidaccess (const char *__path, int __mode);
+int __attribute__((__cdecl__)) execl (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execle (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execlp (const char *__file, const char *, ... );
+int __attribute__((__cdecl__)) execv (const char *__path, char * const __argv[] );
+int __attribute__((__cdecl__)) execve (const char *__path, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) execvp (const char *__file, char * const __argv[] );
+int __attribute__((__cdecl__)) execvpe (const char *__file, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) faccessat (int __dirfd, const char *__path, int __mode, int __flags);
+int __attribute__((__cdecl__)) fchdir (int __fildes);
+int __attribute__((__cdecl__)) fchmod (int __fildes, mode_t __mode );
+int __attribute__((__cdecl__)) fchown (int __fildes, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) fchownat (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags);
+int __attribute__((__cdecl__)) fexecve (int __fd, char * const __argv[], char * const __envp[] );
+pid_t __attribute__((__cdecl__)) fork (void );
+long __attribute__((__cdecl__)) fpathconf (int __fd, int __name );
+int __attribute__((__cdecl__)) fsync (int __fd);
+int __attribute__((__cdecl__)) fdatasync (int __fd);
+char * __attribute__((__cdecl__)) getcwd (char *__buf, size_t __size );
+int __attribute__((__cdecl__)) getdomainname (char *__name, size_t __len);
+gid_t __attribute__((__cdecl__)) getegid (void );
+uid_t __attribute__((__cdecl__)) geteuid (void );
+gid_t __attribute__((__cdecl__)) getgid (void );
+int __attribute__((__cdecl__)) getgroups (int __gidsetsize, gid_t __grouplist[] );
+long __attribute__((__cdecl__)) gethostid (void);
+char * __attribute__((__cdecl__)) getlogin (void );
+int __attribute__((__cdecl__)) getlogin_r (char *name, size_t namesize);
+char * __attribute__((__cdecl__)) getpass (const char *__prompt);
+int __attribute__((__cdecl__)) getpagesize (void);
+int __attribute__((__cdecl__)) getpeereid (int, uid_t *, gid_t *);
+pid_t __attribute__((__cdecl__)) getpgid (pid_t);
+pid_t __attribute__((__cdecl__)) getpgrp (void );
+pid_t __attribute__((__cdecl__)) getpid (void );
+pid_t __attribute__((__cdecl__)) getppid (void );
+pid_t __attribute__((__cdecl__)) getsid (pid_t);
+uid_t __attribute__((__cdecl__)) getuid (void );
+char * __attribute__((__cdecl__)) getusershell (void);
+char * __attribute__((__cdecl__)) getwd (char *__buf );
+int __attribute__((__cdecl__)) iruserok (unsigned long raddr, int superuser, const char *ruser, const char *luser);
+int __attribute__((__cdecl__)) isatty (int __fildes );
+int __attribute__((__cdecl__)) lchown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) link (const char *__path1, const char *__path2 );
+int __attribute__((__cdecl__)) linkat (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags );
+int __attribute__((__cdecl__)) nice (int __nice_value );
+off_t __attribute__((__cdecl__)) lseek (int __fildes, off_t __offset, int __whence );
+int __attribute__((__cdecl__)) lockf (int __fd, int __cmd, off_t __len);
+long __attribute__((__cdecl__)) pathconf (const char *__path, int __name );
+int __attribute__((__cdecl__)) pause (void );
+int __attribute__((__cdecl__)) pthread_atfork (void (*)(void), void (*)(void), void (*)(void));
+int __attribute__((__cdecl__)) pipe (int __fildes[2] );
+int __attribute__((__cdecl__)) pipe2 (int __fildes[2], int flags);
+ssize_t __attribute__((__cdecl__)) pread (int __fd, void *__buf, size_t __nbytes, off_t __offset);
+ssize_t __attribute__((__cdecl__)) pwrite (int __fd, const void *__buf, size_t __nbytes, off_t __offset);
+_ssize_t __attribute__((__cdecl__)) read (int __fd, void *__buf, size_t __nbyte );
+int __attribute__((__cdecl__)) rresvport (int *__alport);
+int __attribute__((__cdecl__)) revoke (char *__path);
+int __attribute__((__cdecl__)) rmdir (const char *__path );
+int __attribute__((__cdecl__)) ruserok (const char *rhost, int superuser, const char *ruser, const char *luser);
+void * __attribute__((__cdecl__)) sbrk (ptrdiff_t __incr);
+int __attribute__((__cdecl__)) setegid (gid_t __gid );
+int __attribute__((__cdecl__)) seteuid (uid_t __uid );
+int __attribute__((__cdecl__)) setgid (gid_t __gid );
+int __attribute__((__cdecl__)) setgroups (int ngroups, const gid_t *grouplist );
+int __attribute__((__cdecl__)) setpgid (pid_t __pid, pid_t __pgid );
+int __attribute__((__cdecl__)) setpgrp (void );
+int __attribute__((__cdecl__)) setregid (gid_t __rgid, gid_t __egid);
+int __attribute__((__cdecl__)) setreuid (uid_t __ruid, uid_t __euid);
+pid_t __attribute__((__cdecl__)) setsid (void );
+int __attribute__((__cdecl__)) setuid (uid_t __uid );
+void __attribute__((__cdecl__)) setusershell (void);
+unsigned __attribute__((__cdecl__)) sleep (unsigned int __seconds );
+void __attribute__((__cdecl__)) swab (const void *, void *, ssize_t);
+long __attribute__((__cdecl__)) sysconf (int __name );
+pid_t __attribute__((__cdecl__)) tcgetpgrp (int __fildes );
+int __attribute__((__cdecl__)) tcsetpgrp (int __fildes, pid_t __pgrp_id );
+char * __attribute__((__cdecl__)) ttyname (int __fildes );
+int __attribute__((__cdecl__)) ttyname_r (int, char *, size_t);
+int __attribute__((__cdecl__)) unlink (const char *__path );
+int __attribute__((__cdecl__)) usleep (useconds_t __useconds);
+int __attribute__((__cdecl__)) vhangup (void );
+_ssize_t __attribute__((__cdecl__)) write (int __fd, const void *__buf, size_t __nbyte );
+extern "C" {
+extern int __attribute__((dllimport)) opterr;
+extern int __attribute__((dllimport)) optind;
+extern int __attribute__((dllimport)) optopt;
+extern int __attribute__((dllimport)) optreset;
+extern char __attribute__((dllimport)) *optarg;
+int getopt (int, char * const *, const char *);
+}
+pid_t __attribute__((__cdecl__)) vfork (void );
+int __attribute__((__cdecl__)) ftruncate (int __fd, off_t __length);
+int __attribute__((__cdecl__)) truncate (const char *, off_t __length);
+int __attribute__((__cdecl__)) getdtablesize (void);
+int __attribute__((__cdecl__)) setdtablesize (int);
+useconds_t __attribute__((__cdecl__)) ualarm (useconds_t __useconds, useconds_t __interval);
+ int __attribute__((__cdecl__)) gethostname (char *__name, size_t __len);
+char * __attribute__((__cdecl__)) mktemp (char *);
+void __attribute__((__cdecl__)) sync (void);
+ssize_t __attribute__((__cdecl__)) readlink (const char *__path, char *__buf, size_t __buflen);
+ssize_t __attribute__((__cdecl__)) readlinkat (int __dirfd1, const char *__path, char *__buf, size_t __buflen);
+int __attribute__((__cdecl__)) symlink (const char *__name1, const char *__name2);
+int __attribute__((__cdecl__)) symlinkat (const char *, int, const char *);
+int __attribute__((__cdecl__)) unlinkat (int, const char *, int);
+}
+
+namespace boost{
+ __extension__ typedef long long long_long_type;
+ __extension__ typedef unsigned long long ulong_long_type;
+}
+namespace mpl_ { namespace aux {} }
+namespace boost { namespace mpl { using namespace mpl_;
+namespace aux { using namespace mpl_::aux; }
+}}
+namespace mpl_ {
+template< int N > struct int_;
+}
+namespace boost { namespace mpl { using ::mpl_::int_; } }
+namespace mpl_ {
+struct integral_c_tag { static const int value = 0; };
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c_tag; } }
+namespace mpl_ {
+template< int N >
+struct int_
+{
+ static const int value = N;
+ typedef int_ type;
+ typedef int value_type;
+ typedef integral_c_tag tag;
+ typedef mpl_::int_< static_cast<int>((value + 1)) > next;
+ typedef mpl_::int_< static_cast<int>((value - 1)) > prior;
+ operator int() const { return static_cast<int>(this->value); }
+};
+template< int N >
+int const mpl_::int_< N >::value;
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename F > struct template_arity;
+}}}
+namespace mpl_ {
+template< bool C_ > struct bool_;
+typedef bool_<true> true_;
+typedef bool_<false> false_;
+}
+namespace boost { namespace mpl { using ::mpl_::bool_; } }
+namespace boost { namespace mpl { using ::mpl_::true_; } }
+namespace boost { namespace mpl { using ::mpl_::false_; } }
+namespace mpl_ {
+template< bool C_ > struct bool_
+{
+ static const bool value = C_;
+ typedef integral_c_tag tag;
+ typedef bool_ type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+template< bool C_ >
+bool const bool_<C_>::value;
+}
+namespace mpl_ {
+template< typename T, T N > struct integral_c;
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c; } }
+namespace mpl_ {
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+ typedef integral_c type;
+ typedef T value_type;
+ typedef integral_c_tag tag;
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+ typedef integral_c< T, static_cast<T>((value - 1)) > prior;
+ operator T() const { return static_cast<T>(this->value); }
+};
+template< typename T, T N >
+T const integral_c< T, N >::value;
+}
+namespace mpl_ {
+template< bool C >
+struct integral_c<bool, C>
+{
+ static const bool value = C;
+ typedef integral_c_tag tag;
+ typedef integral_c type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+}
+namespace boost{
+template <class T, T val>
+struct integral_constant : public mpl::integral_c<T, val>
+{
+ typedef integral_constant<T,val> type;
+};
+template<> struct integral_constant<bool,true> : public mpl::true_
+{
+ typedef integral_constant<bool,true> type;
+};
+template<> struct integral_constant<bool,false> : public mpl::false_
+{
+ typedef integral_constant<bool,false> type;
+};
+typedef integral_constant<bool,true> true_type;
+typedef integral_constant<bool,false> false_type;
+}
+namespace boost {
+template< typename T > struct is_lvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_lvalue_reference< T& > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_rvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+namespace type_traits {
+typedef char yes_type;
+struct no_type
+{
+ char padding[8];
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
+struct ice_or;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_or
+{
+ static const bool value = true;
+};
+template <>
+struct ice_or<false, false, false, false, false, false, false>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
+struct ice_and;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_and
+{
+ static const bool value = false;
+};
+template <>
+struct ice_and<true, true, true, true, true, true, true>
+{
+ static const bool value = true;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b>
+struct ice_not
+{
+ static const bool value = true;
+};
+template <>
+struct ice_not<true>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <int b1, int b2>
+struct ice_eq
+{
+ static const bool value = (b1 == b2);
+};
+template <int b1, int b2>
+struct ice_ne
+{
+ static const bool value = (b1 != b2);
+};
+template <int b1, int b2> bool const ice_eq<b1,b2>::value;
+template <int b1, int b2> bool const ice_ne<b1,b2>::value;
+}
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct is_reference_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value >::value);
+};
+}
+template< typename T > struct is_reference : public ::boost::integral_constant<bool,::boost::detail::is_reference_impl<T>::value> { public: };
+}
+namespace boost {
+namespace type_traits {
+struct false_result
+{
+ template <typename T> struct result_
+ {
+ static const bool value = false;
+ };
+};
+}}
+namespace boost {
+namespace type_traits {
+template <class R>
+struct is_function_ptr_helper
+{
+ static const bool value = false;
+};
+template <class R >
+struct is_function_ptr_helper<R (*)()> { static const bool value = true; };
+template <class R >
+struct is_function_ptr_helper<R (*)( ...)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)> { static const bool value = true; };
+}
+}
+namespace boost {
+namespace detail {
+template<bool is_ref = true>
+struct is_function_chooser
+ : public ::boost::type_traits::false_result
+{
+};
+template <>
+struct is_function_chooser<false>
+{
+ template< typename T > struct result_
+ : public ::boost::type_traits::is_function_ptr_helper<T*>
+ {
+ };
+};
+template <typename T>
+struct is_function_impl
+ : public is_function_chooser< ::boost::is_reference<T>::value >
+ ::template result_<T>
+{
+};
+}
+template< typename T > struct is_function : public ::boost::integral_constant<bool,::boost::detail::is_function_impl<T>::value> { public: };
+}
+namespace boost
+{
+ template <bool B, class T = void>
+ struct enable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct enable_if_c<false, T> {};
+ template <class Cond, class T = void>
+ struct enable_if : public enable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_enable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_enable_if_c<false, T> {};
+ template <class Cond, class T>
+ struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+ template <bool B, class T = void>
+ struct disable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct disable_if_c<true, T> {};
+ template <class Cond, class T = void>
+ struct disable_if : public disable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_disable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_disable_if_c<true, T> {};
+ template <class Cond, class T>
+ struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+}
+namespace boost { namespace type_of {
+ template<typename T>
+ typename enable_if<is_function<T>, T&>::type
+ ensure_obj(T&);
+ template<typename T>
+ typename disable_if<is_function<T>, T&>::type
+ ensure_obj(const T&);
+}}
+namespace boost { namespace scope_exit { namespace aux {
+ template<int Dummy = 0>
+ struct declared
+ {
+ void* value;
+ static int const cmp2 = 0;
+ friend void operator>(int, declared const&) {}
+ };
+ struct undeclared { declared<> dummy[2]; };
+ template<int> struct resolve;
+ template<>
+ struct resolve<sizeof(declared<>)>
+ {
+ static const int cmp1 = 0;
+ };
+ template<>
+ struct resolve<sizeof(undeclared)>
+ {
+ template<int>
+ struct cmp1
+ {
+ static int const cmp2 = 0;
+ };
+ };
+} } }
+extern boost::scope_exit::aux::undeclared boost_scope_exit_args;
+namespace boost { namespace scope_exit { namespace aux {
+typedef void (*ref_tag)(int&);
+typedef void (*val_tag)(int );
+template<class T, class Tag> struct member;
+template<class T>
+struct member<T,ref_tag>
+{
+ T& value;
+};
+template<class T>
+struct member<T,val_tag>
+{
+ T value;
+};
+template<class T> inline T& deref(T* p, ref_tag) { return *p; }
+template<class T> inline T& deref(T& r, val_tag) { return r; }
+template<class T>
+struct wrapper
+{
+ typedef T type;
+};
+template<class T> wrapper<T> wrap(T&);
+} } }
+
+namespace boost {
+template< typename T > struct remove_pointer { public: typedef T type; };
+template< typename T > struct remove_pointer<T*> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* volatile> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const volatile> { public: typedef T type; };
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace detail{
+template <class T>
+struct remove_rvalue_ref
+{
+ typedef T type;
+};
+}
+template< typename T > struct remove_reference { public: typedef typename boost::detail::remove_rvalue_ref<T>::type type; };
+template< typename T > struct remove_reference<T&> { public: typedef T type; };
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct add_pointer_impl
+{
+ typedef typename remove_reference<T>::type no_ref_type;
+ typedef no_ref_type* type;
+};
+}
+template< typename T > struct add_pointer { public: typedef typename boost::detail::add_pointer_impl<T>::type type; };
+}
+namespace boost {
+namespace detail {
+template<typename Function> struct function_traits_helper;
+template<typename R>
+struct function_traits_helper<R (*)(void)>
+{
+ static const unsigned arity = 0;
+ typedef R result_type;
+};
+template<typename R, typename T1>
+struct function_traits_helper<R (*)(T1)>
+{
+ static const unsigned arity = 1;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T1 argument_type;
+};
+template<typename R, typename T1, typename T2>
+struct function_traits_helper<R (*)(T1, T2)>
+{
+ static const unsigned arity = 2;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T1 first_argument_type;
+ typedef T2 second_argument_type;
+};
+template<typename R, typename T1, typename T2, typename T3>
+struct function_traits_helper<R (*)(T1, T2, T3)>
+{
+ static const unsigned arity = 3;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4>
+struct function_traits_helper<R (*)(T1, T2, T3, T4)>
+{
+ static const unsigned arity = 4;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
+{
+ static const unsigned arity = 5;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
+{
+ static const unsigned arity = 6;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
+{
+ static const unsigned arity = 7;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
+{
+ static const unsigned arity = 8;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
+{
+ static const unsigned arity = 9;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9,
+ typename T10>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
+{
+ static const unsigned arity = 10;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+ typedef T10 arg10_type;
+};
+}
+template<typename Function>
+struct function_traits :
+ public boost::detail::function_traits_helper<typename boost::add_pointer<Function>::type>
+{
+};
+}
+
+namespace boost {
+template< typename T > struct is_integral : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_integral< unsigned char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< bool > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< wchar_t > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::ulong_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::long_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_float : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_float< float > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< long double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T >
+struct is_arithmetic_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_float<T>::value >::value);
+};
+}
+template< typename T > struct is_arithmetic : public ::boost::integral_constant<bool,::boost::detail::is_arithmetic_impl<T>::value> { public: };
+}
+namespace boost {
+template< typename T, typename U > struct is_same : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_same< T,T > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template <typename T> struct cv_traits_imp {};
+template <typename T>
+struct cv_traits_imp<T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<volatile T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const volatile T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+}
+}
+namespace boost {
+namespace detail{
+template <class T>
+struct is_volatile_rval_filter
+{
+ static const bool value = ::boost::detail::cv_traits_imp<T*>::is_volatile;
+};
+}
+template< typename T > struct is_volatile : public ::boost::integral_constant<bool,::boost::detail::is_volatile_rval_filter<T>::value> { public: };
+template< typename T > struct is_volatile< T& > : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+template< typename T > struct is_enum : public ::boost::integral_constant<bool,__is_enum(T)> { public: };
+}
+namespace boost {
+namespace type_traits {
+template <typename T>
+struct is_mem_fun_pointer_impl
+{
+ static const bool value = false;
+};
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile > { static const bool value = true; };
+}
+}
+
+namespace boost {
+namespace detail{
+template <class T>
+struct rvalue_ref_filter_rem_cv
+{
+ typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
+};
+}
+template< typename T > struct remove_cv { public: typedef typename boost::detail::rvalue_ref_filter_rem_cv<T>::type type; };
+template< typename T > struct remove_cv<T&> { public: typedef T& type; };
+template< typename T, std::size_t N > struct remove_cv<T const[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T volatile[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T const volatile[N]> { public: typedef T type[N]; };
+}
+namespace boost {
+template< typename T > struct is_member_function_pointer : public ::boost::integral_constant<bool,::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value> { public: };
+}
+namespace boost {
+template< typename T > struct is_member_pointer : public ::boost::integral_constant<bool,::boost::is_member_function_pointer<T>::value> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::* > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*volatile > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T > struct is_pointer_helper
+{
+ static const bool value = false;
+};
+template< typename T > struct is_pointer_helper<T*> { static const bool value = true; };
+template< typename T >
+struct is_pointer_impl
+{
+ static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value);
+};
+}
+template< typename T > struct is_pointer : public ::boost::integral_constant<bool,::boost::detail::is_pointer_impl<T>::value> { public: };
+}
+namespace boost{
+namespace detail{
+template <typename T, bool small_>
+struct ct_imp2
+{
+ typedef const T& param_type;
+};
+template <typename T>
+struct ct_imp2<T, true>
+{
+ typedef const T param_type;
+};
+template <typename T, bool isp, bool b1, bool b2>
+struct ct_imp
+{
+ typedef const T& param_type;
+};
+template <typename T, bool isp, bool b2>
+struct ct_imp<T, isp, true, b2>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool isp, bool b1>
+struct ct_imp<T, isp, b1, true>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool b1, bool b2>
+struct ct_imp<T, true, b1, b2>
+{
+ typedef const T param_type;
+};
+}
+template <typename T>
+struct call_traits
+{
+public:
+ typedef T value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef typename boost::detail::ct_imp<
+ T,
+ ::boost::is_pointer<T>::value,
+ ::boost::is_arithmetic<T>::value,
+ ::boost::is_enum<T>::value
+ >::param_type param_type;
+};
+template <typename T>
+struct call_traits<T&>
+{
+ typedef T& value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T& param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<T [N]>
+{
+private:
+ typedef T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<const T [N]>
+{
+private:
+ typedef const T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+}
+namespace boost { namespace local { namespace aux {
+template<typename F, size_t defaults = 0>
+class function {
+};
+template<
+ typename R
+
+
+>
+class function<
+ R ()
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()() const { return call0_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr1)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); } inline R operator()() const { return call1_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr2)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); } inline R operator()() const { return call2_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr3)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); } inline R operator()() const { return call3_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr4)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); } inline R operator()() const { return call4_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 5
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr5)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4 , call_ptr5 call5
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4; call5_ = call5;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); } inline R operator()() const { return call5_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_; call_ptr5 call5_;
+ void* unused_;
+};
+}}}
+namespace boost { namespace local { namespace aux {
+template<typename T> struct add_pointed_const { typedef T type; };
+template<typename T> struct add_pointed_const<T*> { typedef T const* type; };
+template<typename T> struct add_pointed_const<T const*>
+ { typedef T const* type; };
+template<typename T> struct add_pointed_const<T* const>
+ { typedef T const* const type; };
+template<typename T> struct add_pointed_const<T const* const>
+ { typedef T const* const type; };
+}}}
+namespace boost {
+template< typename T > struct add_const { public: typedef T const type; };
+template< typename T > struct add_const<T&> { public: typedef T& type; };
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct nested_type_wknd
+ : T::type
+{
+};
+}}}
+namespace mpl_ {
+struct void_;
+}
+namespace boost { namespace mpl { using ::mpl_::void_; } }
+namespace mpl_ {
+struct na
+{
+ typedef na type;
+ enum { value = 0 };
+};
+}
+namespace boost { namespace mpl { using ::mpl_::na; } }
+namespace boost { namespace mpl {
+template< typename T >
+struct is_na
+ : false_
+{
+};
+template<>
+struct is_na<na>
+ : true_
+{
+};
+template< typename T >
+struct is_not_na
+ : true_
+{
+};
+template<>
+struct is_not_na<na>
+ : false_
+{
+};
+template< typename T, typename U > struct if_na
+{
+ typedef T type;
+};
+template< typename U > struct if_na<na,U>
+{
+ typedef U type;
+};
+}}
+namespace boost { namespace mpl {
+template<
+ typename T = na
+ , typename Tag = void_
+ , typename Arity = int_< aux::template_arity<T>::value >
+ >
+struct lambda;
+}}
+namespace boost { namespace mpl {
+namespace aux {
+template< long C_ >
+struct not_impl
+ : bool_<!C_>
+{
+};
+}
+template<
+ typename T = na
+ >
+struct not_
+ : aux::not_impl<
+ ::boost::mpl::aux::nested_type_wknd<T>::value
+ >
+{
+
+};
+template<> struct not_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : not_< T1 > { }; }; template< typename Tag > struct lambda< not_< na > , Tag , int_<-1> > { typedef false_ is_le; typedef not_< na > result_; typedef not_< na > type; }; namespace aux { template< typename T1 > struct template_arity< not_< T1 > > : int_<1> { }; template<> struct template_arity< not_< na > > : int_<-1> { }; }
+}}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct value_type_wknd
+{
+ typedef typename T::value_type type;
+};
+}}}
+namespace boost { namespace mpl { namespace aux {
+typedef char (&no_tag)[1];
+typedef char (&yes_tag)[2];
+template< bool C_ > struct yes_no_tag
+{
+ typedef no_tag type;
+};
+template<> struct yes_no_tag<true>
+{
+ typedef yes_tag type;
+};
+template< long n > struct weighted_tag
+{
+ typedef char (&type)[n];
+};
+}}}
+
+namespace mpl_ {
+struct failed {};
+template< bool C > struct assert { typedef void* type; };
+template<> struct assert<false> { typedef assert type; };
+template< bool C >
+int assertion_failed( typename assert<C>::type );
+template< bool C >
+struct assertion
+{
+ static int failed( assert<false> );
+};
+template<>
+struct assertion<true>
+{
+ static int failed( void* );
+};
+struct assert_
+{
+ template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};
+ static assert_ const arg;
+ enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };
+};
+boost::mpl::aux::weighted_tag<1>::type operator==( assert_, assert_ );
+boost::mpl::aux::weighted_tag<2>::type operator!=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<3>::type operator>( assert_, assert_ );
+boost::mpl::aux::weighted_tag<4>::type operator>=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<5>::type operator<( assert_, assert_ );
+boost::mpl::aux::weighted_tag<6>::type operator<=( assert_, assert_ );
+template< assert_::relations r, long x, long y > struct assert_relation {};
+template< bool > struct assert_arg_pred_impl { typedef int type; };
+template<> struct assert_arg_pred_impl<true> { typedef void* type; };
+template< typename P > struct assert_arg_pred
+{
+ typedef typename P::type p_type;
+ typedef typename assert_arg_pred_impl< p_type::value >::type type;
+};
+template< typename P > struct assert_arg_pred_not
+{
+ typedef typename P::type p_type;
+ enum { p = !p_type::value };
+ typedef typename assert_arg_pred_impl<p>::type type;
+};
+template< typename Pred >
+failed ************ (Pred::************
+ assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )
+ );
+template< typename Pred >
+failed ************ (boost::mpl::not_<Pred>::************
+ assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )
+ );
+template< typename Pred >
+assert<false>
+assert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );
+template< typename Pred >
+assert<false>
+assert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );
+}
+extern boost::scope_exit::aux::undeclared boost_closure_auxXargsX;
+
+
+namespace std {
+ void
+ __throw_bad_exception(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_cast(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_typeid(void) __attribute__((__noreturn__));
+ void
+ __throw_logic_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_domain_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_invalid_argument(const char*) __attribute__((__noreturn__));
+ void
+ __throw_length_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_out_of_range(const char*) __attribute__((__noreturn__));
+ void
+ __throw_runtime_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_range_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_overflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_underflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_ios_failure(const char*) __attribute__((__noreturn__));
+ void
+ __throw_system_error(int) __attribute__((__noreturn__));
+ void
+ __throw_future_error(int) __attribute__((__noreturn__));
+ void
+ __throw_bad_function_call() __attribute__((__noreturn__));
+}
+
+namespace __gnu_cxx {
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+}
+namespace std {
+ struct __true_type { };
+ struct __false_type { };
+ template<bool>
+ struct __truth_type
+ { typedef __false_type __type; };
+ template<>
+ struct __truth_type<true>
+ { typedef __true_type __type; };
+ template<class _Sp, class _Tp>
+ struct __traitor
+ {
+ enum { __value = bool(_Sp::__value) || bool(_Tp::__value) };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+ template<typename, typename>
+ struct __are_same
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __are_same<_Tp, _Tp>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_void
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_void<void>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_integer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_integer<bool>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_floating
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_floating<float>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<long double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer<_Tp*>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_normal_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Iterator, typename _Container>
+ struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator,
+ _Container> >
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_arithmetic
+ : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_fundamental
+ : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_scalar
+ : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_char
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_char<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_char<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_byte
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_byte<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_move_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ class __is_iterator_helper
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+ template<typename _Up>
+ struct _Wrap_type
+ { };
+ template<typename _Up>
+ static __one __test(_Wrap_type<typename _Up::iterator_category>*);
+ template<typename _Up>
+ static __two __test(...);
+ public:
+ static const bool __value = (sizeof(__test<_Tp>(0)) == 1
+ || __is_pointer<_Tp>::__value);
+ };
+ template<typename _Tp>
+ struct __is_iterator
+ {
+ enum { __value = __is_iterator_helper<_Tp>::__value };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<bool, typename>
+ struct __enable_if
+ { };
+ template<typename _Tp>
+ struct __enable_if<true, _Tp>
+ { typedef _Tp __type; };
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct __conditional_type
+ { typedef _Iftrue __type; };
+ template<typename _Iftrue, typename _Iffalse>
+ struct __conditional_type<false, _Iftrue, _Iffalse>
+ { typedef _Iffalse __type; };
+ template<typename _Tp>
+ struct __add_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __add_unsigned<char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<signed char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<short>
+ { typedef unsigned short __type; };
+ template<>
+ struct __add_unsigned<int>
+ { typedef unsigned int __type; };
+ template<>
+ struct __add_unsigned<long>
+ { typedef unsigned long __type; };
+ template<>
+ struct __add_unsigned<long long>
+ { typedef unsigned long long __type; };
+ template<>
+ struct __add_unsigned<bool>;
+ template<>
+ struct __add_unsigned<wchar_t>;
+ template<typename _Tp>
+ struct __remove_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __remove_unsigned<char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned short>
+ { typedef short __type; };
+ template<>
+ struct __remove_unsigned<unsigned int>
+ { typedef int __type; };
+ template<>
+ struct __remove_unsigned<unsigned long>
+ { typedef long __type; };
+ template<>
+ struct __remove_unsigned<unsigned long long>
+ { typedef long long __type; };
+ template<>
+ struct __remove_unsigned<bool>;
+ template<>
+ struct __remove_unsigned<wchar_t>;
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type* __ptr)
+ { return __ptr == 0; }
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type)
+ { return false; }
+ template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
+ struct __promote
+ { typedef double __type; };
+ template<typename _Tp>
+ struct __promote<_Tp, false>
+ { typedef _Tp __type; };
+ template<typename _Tp, typename _Up>
+ struct __promote_2
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ public:
+ typedef __typeof__(__type1() + __type2()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp>
+ struct __promote_3
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp, typename _Wp>
+ struct __promote_4
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ typedef typename __promote<_Wp>::__type __type4;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3() + __type4()) __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<typename _Value>
+ struct __numeric_traits_integer
+ {
+ static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0);
+ static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0);
+ static const bool __is_signed = ((_Value)(-1) < 0);
+ static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0));
+ };
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__min;
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__max;
+ template<typename _Value>
+ const bool __numeric_traits_integer<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_integer<_Value>::__digits;
+ template<typename _Value>
+ struct __numeric_traits_floating
+ {
+ static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 3010 / 10000);
+ static const bool __is_signed = true;
+ static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18);
+ static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932);
+ };
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_digits10;
+ template<typename _Value>
+ const bool __numeric_traits_floating<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__digits10;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_exponent10;
+ template<typename _Value>
+ struct __numeric_traits
+ : public __conditional_type<std::__is_integer<_Value>::__value,
+ __numeric_traits_integer<_Value>,
+ __numeric_traits_floating<_Value> >::__type
+ { };
+}
+
+
+namespace std {
+ struct input_iterator_tag { };
+ struct output_iterator_tag { };
+ struct forward_iterator_tag : public input_iterator_tag { };
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<const _Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ };
+ template<typename _Iter>
+ inline typename iterator_traits<_Iter>::iterator_category
+ __iterator_category(const _Iter&)
+ { return typename iterator_traits<_Iter>::iterator_category(); }
+}
+
+namespace std {
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ __distance(_InputIterator __first, _InputIterator __last,
+ input_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ while (__first != __last)
+ {
+ ++__first;
+ ++__n;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator>
+ inline typename iterator_traits<_RandomAccessIterator>::difference_type
+ __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ return __last - __first;
+ }
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ distance(_InputIterator __first, _InputIterator __last)
+ {
+ return std::__distance(__first, __last,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
+ {
+
+ while (__n--)
+ ++__i;
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ inline void
+ __advance(_BidirectionalIterator& __i, _Distance __n,
+ bidirectional_iterator_tag)
+ {
+
+ if (__n > 0)
+ while (__n--)
+ ++__i;
+ else
+ while (__n++)
+ --__i;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline void
+ __advance(_RandomAccessIterator& __i, _Distance __n,
+ random_access_iterator_tag)
+ {
+
+ __i += __n;
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ advance(_InputIterator& __i, _Distance __n)
+ {
+ typename iterator_traits<_InputIterator>::difference_type __d = __n;
+ std::__advance(__i, __d, std::__iterator_category(__i));
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::pointer pointer;
+ typedef typename __traits_type::reference reference;
+ reverse_iterator() : current() { }
+ explicit
+ reverse_iterator(iterator_type __x) : current(__x) { }
+ reverse_iterator(const reverse_iterator& __x)
+ : current(__x.current) { }
+ template<typename _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x)
+ : current(__x.base()) { }
+ iterator_type
+ base() const
+ { return current; }
+ reference
+ operator*() const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer
+ operator->() const
+ { return &(operator*()); }
+ reverse_iterator&
+ operator++()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator
+ operator++(int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator&
+ operator--()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator
+ operator--(int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator
+ operator+(difference_type __n) const
+ { return reverse_iterator(current - __n); }
+ reverse_iterator&
+ operator+=(difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator
+ operator-(difference_type __n) const
+ { return reverse_iterator(current + __n); }
+ reverse_iterator&
+ operator-=(difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference
+ operator[](difference_type __n) const
+ { return *(*this + __n); }
+ };
+ template<typename _Iterator>
+ inline bool
+ operator==(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator<(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator!=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x == __y); }
+ template<typename _Iterator>
+ inline bool
+ operator>(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y < __x; }
+ template<typename _Iterator>
+ inline bool
+ operator<=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__y < __x); }
+ template<typename _Iterator>
+ inline bool
+ operator>=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x < __y); }
+ template<typename _Iterator>
+ inline typename reverse_iterator<_Iterator>::difference_type
+ operator-(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Iterator>
+ inline reverse_iterator<_Iterator>
+ operator+(typename reverse_iterator<_Iterator>::difference_type __n,
+ const reverse_iterator<_Iterator>& __x)
+ { return reverse_iterator<_Iterator>(__x.base() - __n); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator==(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator!=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x == __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y < __x; }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__y < __x); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x < __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline typename reverse_iterator<_IteratorL>::difference_type
+ operator-(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Container>
+ class back_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit
+ back_insert_iterator(_Container& __x) : container(&__x) { }
+ back_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_back(__value);
+ return *this;
+ }
+ back_insert_iterator&
+ operator*()
+ { return *this; }
+ back_insert_iterator&
+ operator++()
+ { return *this; }
+ back_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline back_insert_iterator<_Container>
+ back_inserter(_Container& __x)
+ { return back_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class front_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit front_insert_iterator(_Container& __x) : container(&__x) { }
+ front_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_front(__value);
+ return *this;
+ }
+ front_insert_iterator&
+ operator*()
+ { return *this; }
+ front_insert_iterator&
+ operator++()
+ { return *this; }
+ front_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline front_insert_iterator<_Container>
+ front_inserter(_Container& __x)
+ { return front_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ typename _Container::iterator iter;
+ public:
+ typedef _Container container_type;
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x), iter(__i) {}
+ insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ iter = container->insert(iter, __value);
+ ++iter;
+ return *this;
+ }
+ insert_iterator&
+ operator*()
+ { return *this; }
+ insert_iterator&
+ operator++()
+ { return *this; }
+ insert_iterator&
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container, typename _Iterator>
+ inline insert_iterator<_Container>
+ inserter(_Container& __x, _Iterator __i)
+ {
+ return insert_iterator<_Container>(__x,
+ typename _Container::iterator(__i));
+ }
+}
+namespace __gnu_cxx {
+ using std::iterator_traits;
+ using std::iterator;
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ protected:
+ _Iterator _M_current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::iterator_category iterator_category;
+ typedef typename __traits_type::value_type value_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::reference reference;
+ typedef typename __traits_type::pointer pointer;
+ __normal_iterator() : _M_current(_Iterator()) { }
+ explicit
+ __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
+ template<typename _Iter>
+ __normal_iterator(const __normal_iterator<_Iter,
+ typename __enable_if<
+ (std::__are_same<_Iter, typename _Container::pointer>::__value),
+ _Container>::__type>& __i)
+ : _M_current(__i.base()) { }
+ reference
+ operator*() const
+ { return *_M_current; }
+ pointer
+ operator->() const
+ { return _M_current; }
+ __normal_iterator&
+ operator++()
+ {
+ ++_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator++(int)
+ { return __normal_iterator(_M_current++); }
+ __normal_iterator&
+ operator--()
+ {
+ --_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator--(int)
+ { return __normal_iterator(_M_current--); }
+ reference
+ operator[](const difference_type& __n) const
+ { return _M_current[__n]; }
+ __normal_iterator&
+ operator+=(const difference_type& __n)
+ { _M_current += __n; return *this; }
+ __normal_iterator
+ operator+(const difference_type& __n) const
+ { return __normal_iterator(_M_current + __n); }
+ __normal_iterator&
+ operator-=(const difference_type& __n)
+ { _M_current -= __n; return *this; }
+ __normal_iterator
+ operator-(const difference_type& __n) const
+ { return __normal_iterator(_M_current - __n); }
+ const _Iterator&
+ base() const
+ { return _M_current; }
+ };
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline typename __normal_iterator<_IteratorL, _Container>::difference_type
+ operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline typename __normal_iterator<_Iterator, _Container>::difference_type
+ operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline __normal_iterator<_Iterator, _Container>
+ operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
+ __n, const __normal_iterator<_Iterator, _Container>& __i)
+ { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
+}
+namespace std
+{
+ namespace __debug { }
+}
+namespace __gnu_debug
+{
+ using namespace std::__debug;
+}
+namespace std {
+ template<bool _BoolType>
+ struct __iter_swap
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ _ValueType1 __tmp = (*__a);
+ *__a = (*__b);
+ *__b = (__tmp);
+ }
+ };
+ template<>
+ struct __iter_swap<true>
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ swap(*__a, *__b);
+ }
+ };
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ typedef typename iterator_traits<_ForwardIterator1>::reference
+ _ReferenceType1;
+ typedef typename iterator_traits<_ForwardIterator2>::reference
+ _ReferenceType2;
+ std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value
+ && __are_same<_ValueType1&, _ReferenceType1>::__value
+ && __are_same<_ValueType2&, _ReferenceType2>::__value>::
+ iter_swap(__a, __b);
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator2
+ swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ std::iter_swap(__first1, __first2);
+ return __first2;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__b < __a)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__a < __b)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__b, __a))
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__a, __b))
+ return __b;
+ return __a;
+ }
+ template<typename _Iterator, bool _HasBase>
+ struct _Iter_base
+ {
+ typedef _Iterator iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it; }
+ };
+ template<typename _Iterator>
+ struct _Iter_base<_Iterator, true>
+ {
+ typedef typename _Iterator::iterator_type iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it.base(); }
+ };
+ template<typename _Iterator>
+ struct _Niter_base
+ : _Iter_base<_Iterator, __is_normal_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Niter_base<_Iterator>::iterator_type
+ __niter_base(_Iterator __it)
+ { return std::_Niter_base<_Iterator>::_S_base(__it); }
+ template<typename _Iterator>
+ struct _Miter_base
+ : _Iter_base<_Iterator, __is_move_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Miter_base<_Iterator>::iterator_type
+ __miter_base(_Iterator __it)
+ { return std::_Miter_base<_Iterator>::_S_base(__it); }
+ template<bool, bool, typename>
+ struct __copy_move
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ for (; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move<false, false, random_access_iterator_tag>
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::difference_type _Distance;
+ for(_Distance __n = __last - __first; __n > 0; --__n)
+ {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
+ return __result + _Num;
+ }
+ };
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::value_type _ValueTypeI;
+ typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
+ typedef typename iterator_traits<_II>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueTypeI)
+ && __is_pointer<_II>::__value
+ && __is_pointer<_OI>::__value
+ && __are_same<_ValueTypeI, _ValueTypeO>::__value);
+ return std::__copy_move<_IsMove, __simple,
+ _Category>::__copy_m(__first, __last, __result);
+ }
+ template<typename _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator;
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(_CharT*, _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(const _CharT*, const _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
+ istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a2(_II __first, _II __last, _OI __result)
+ {
+ return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first),
+ std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _II, typename _OI>
+ inline _OI
+ copy(_II __first, _II __last, _OI __result)
+ {
+
+
+ ;
+ return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<bool, bool, typename>
+ struct __copy_move_backward
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ while (__first != __last)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move_backward<false, false, random_access_iterator_tag>
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typename iterator_traits<_BI1>::difference_type __n;
+ for (__n = __last - __first; __n > 0; --__n)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
+ return __result - _Num;
+ }
+ };
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typedef typename iterator_traits<_BI1>::value_type _ValueType1;
+ typedef typename iterator_traits<_BI2>::value_type _ValueType2;
+ typedef typename iterator_traits<_BI1>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueType1)
+ && __is_pointer<_BI1>::__value
+ && __is_pointer<_BI2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__copy_move_backward<_IsMove, __simple,
+ _Category>::__copy_move_b(__first,
+ __last,
+ __result);
+ }
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ return _BI2(std::__copy_move_backward_a<_IsMove>
+ (std::__niter_base(__first), std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _BI1, typename _BI2>
+ inline _BI2
+ copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+
+
+
+ ;
+ return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ for (; __first != __last; ++__first)
+ *__first = __value;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __first != __last; ++__first)
+ *__first = __tmp;
+ }
+ template<typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
+ __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
+ {
+ const _Tp __tmp = __c;
+ __builtin_memset(__first, static_cast<unsigned char>(__tmp),
+ __last - __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ {
+
+ ;
+ std::__fill_a(std::__niter_base(__first), std::__niter_base(__last),
+ __value);
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ for (; __n > 0; --__n, ++__first)
+ *__first = __value;
+ return __first;
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __n > 0; --__n, ++__first)
+ *__first = __tmp;
+ return __first;
+ }
+ template<typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
+ __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
+ {
+ std::__fill_a(__first, __first + __n, __c);
+ return __first + __n;
+ }
+ template<typename _OI, typename _Size, typename _Tp>
+ inline _OI
+ fill_n(_OI __first, _Size __n, const _Tp& __value)
+ {
+
+ return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
+ }
+ template<bool _BoolType>
+ struct __equal
+ {
+ template<typename _II1, typename _II2>
+ static bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!(*__first1 == *__first2))
+ return false;
+ return true;
+ }
+ };
+ template<>
+ struct __equal<true>
+ {
+ template<typename _Tp>
+ static bool
+ equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
+ {
+ return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
+ * (__last1 - __first1));
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple = (__is_integer<_ValueType1>::__value
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__equal<__simple>::equal(__first1, __last1, __first2);
+ }
+ template<typename, typename>
+ struct __lc_rai
+ {
+ template<typename _II1, typename _II2>
+ static _II1
+ __newlast1(_II1, _II1 __last1, _II2, _II2)
+ { return __last1; }
+ template<typename _II>
+ static bool
+ __cnd2(_II __first, _II __last)
+ { return __first != __last; }
+ };
+ template<>
+ struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
+ {
+ template<typename _RAI1, typename _RAI2>
+ static _RAI1
+ __newlast1(_RAI1 __first1, _RAI1 __last1,
+ _RAI2 __first2, _RAI2 __last2)
+ {
+ const typename iterator_traits<_RAI1>::difference_type
+ __diff1 = __last1 - __first1;
+ const typename iterator_traits<_RAI2>::difference_type
+ __diff2 = __last2 - __first2;
+ return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
+ }
+ template<typename _RAI>
+ static bool
+ __cnd2(_RAI, _RAI)
+ { return true; }
+ };
+ template<bool _BoolType>
+ struct __lexicographical_compare
+ {
+ template<typename _II1, typename _II2>
+ static bool __lc(_II1, _II1, _II2, _II2);
+ };
+ template<bool _BoolType>
+ template<typename _II1, typename _II2>
+ bool
+ __lexicographical_compare<_BoolType>::
+ __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+ __last1 = __rai_type::__newlast1(__first1, __last1,
+ __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (*__first1 < *__first2)
+ return true;
+ if (*__first2 < *__first1)
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<>
+ struct __lexicographical_compare<true>
+ {
+ template<typename _Tp, typename _Up>
+ static bool
+ __lc(const _Tp* __first1, const _Tp* __last1,
+ const _Up* __first2, const _Up* __last2)
+ {
+ const size_t __len1 = __last1 - __first1;
+ const size_t __len2 = __last2 - __first2;
+ const int __result = __builtin_memcmp(__first1, __first2,
+ std::min(__len1, __len2));
+ return __result != 0 ? __result < 0 : __len1 < __len2;
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple =
+ (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value
+ && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed
+ && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value);
+ return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
+ __first2, __last2);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _Size>
+ inline _Size
+ __lg(_Size __n)
+ {
+ _Size __k;
+ for (__k = 0; __n != 0; __n >>= 1)
+ ++__k;
+ return __k - 1;
+ }
+ inline int
+ __lg(int __n)
+ { return sizeof(int) * 8 - 1 - __builtin_clz(__n); }
+ inline long
+ __lg(long __n)
+ { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); }
+ inline long long
+ __lg(long long __n)
+ { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); }
+}
+namespace std {
+ template<typename _II1, typename _II2>
+ inline bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+
+
+
+ ;
+ return std::__equal_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2));
+ }
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ inline bool
+ equal(_IIter1 __first1, _IIter1 __last1,
+ _IIter2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!bool(__binary_pred(*__first1, *__first2)))
+ return false;
+ return true;
+ }
+ template<typename _II1, typename _II2>
+ inline bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+
+
+
+
+ ;
+ ;
+ return std::__lexicographical_compare_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2),
+ std::__niter_base(__last2));
+ }
+ template<typename _II1, typename _II2, typename _Compare>
+ bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2, _Compare __comp)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+
+
+ ;
+ ;
+ __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (__comp(*__first1, *__first2))
+ return true;
+ if (__comp(*__first2, *__first1))
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2)
+ {
+
+
+
+ ;
+ while (__first1 != __last1 && *__first1 == *__first2)
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _BinaryPredicate>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ while (__first1 != __last1 && bool(__binary_pred(*__first1, *__first2)))
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+}
+
+
+extern "C" {
+typedef unsigned long __ULong;
+struct _reent;
+struct _Bigint
+{
+ struct _Bigint *_next;
+ int _k, _maxwds, _sign, _wds;
+ __ULong _x[1];
+};
+struct __tm
+{
+ int __tm_sec;
+ int __tm_min;
+ int __tm_hour;
+ int __tm_mday;
+ int __tm_mon;
+ int __tm_year;
+ int __tm_wday;
+ int __tm_yday;
+ int __tm_isdst;
+};
+struct _on_exit_args {
+ void * _fnargs[32];
+ void * _dso_handle[32];
+ __ULong _fntypes;
+ __ULong _is_cxa;
+};
+struct _atexit {
+ struct _atexit *_next;
+ int _ind;
+ void (*_fns[32])(void);
+ struct _on_exit_args _on_exit_args;
+};
+struct __sbuf {
+ unsigned char *_base;
+ int _size;
+};
+struct __sFILE {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _offset;
+ struct _reent *_data;
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+ int _flags2;
+};
+struct __sFILE64 {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ struct _reent *_data;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _flags2;
+ _off64_t _offset;
+ _fpos64_t (__attribute__((__cdecl__)) * _seek64) (struct _reent *, void *, _fpos64_t, int);
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+};
+typedef struct __sFILE64 __FILE;
+struct _glue
+{
+ struct _glue *_next;
+ int _niobs;
+ __FILE *_iobs;
+};
+struct _rand48 {
+ unsigned short _seed[3];
+ unsigned short _mult[3];
+ unsigned short _add;
+};
+struct _reent
+{
+ int _errno;
+ __FILE *_stdin, *_stdout, *_stderr;
+ int _inc;
+ char _emergency[25];
+ int _current_category;
+ const char *_current_locale;
+ int __sdidinit;
+ void (__attribute__((__cdecl__)) * __cleanup) (struct _reent *);
+ struct _Bigint *_result;
+ int _result_k;
+ struct _Bigint *_p5s;
+ struct _Bigint **_freelist;
+ int _cvtlen;
+ char *_cvtbuf;
+ union
+ {
+ struct
+ {
+ unsigned int _unused_rand;
+ char * _strtok_last;
+ char _asctime_buf[26];
+ struct __tm _localtime_buf;
+ int _gamma_signgam;
+ __extension__ unsigned long long _rand_next;
+ struct _rand48 _r48;
+ _mbstate_t _mblen_state;
+ _mbstate_t _mbtowc_state;
+ _mbstate_t _wctomb_state;
+ char _l64a_buf[8];
+ char _signal_buf[24];
+ int _getdate_err;
+ _mbstate_t _mbrlen_state;
+ _mbstate_t _mbrtowc_state;
+ _mbstate_t _mbsrtowcs_state;
+ _mbstate_t _wcrtomb_state;
+ _mbstate_t _wcsrtombs_state;
+ int _h_errno;
+ } _reent;
+ struct
+ {
+ unsigned char * _nextf[30];
+ unsigned int _nmalloc[30];
+ } _unused;
+ } _new;
+ struct _atexit *_atexit;
+ struct _atexit _atexit0;
+ void (**(_sig_func))(int);
+ struct _glue __sglue;
+ __FILE __sf[3];
+};
+extern struct _reent *_impure_ptr ;
+extern struct _reent *const _global_impure_ptr ;
+void _reclaim_reent (struct _reent *);
+ struct _reent * __attribute__((__cdecl__)) __getreent (void);
+}
+extern "C" {
+char *mkdtemp (char *);
+}
+extern "C"
+{
+const char *getprogname (void);
+void setprogname (const char *);
+char *realpath (const char *, char *);
+char *canonicalize_file_name (const char *);
+int unsetenv (const char *);
+char *initstate (unsigned seed, char *state, size_t size);
+long random (void);
+char *setstate (const char *state);
+void srandom (unsigned);
+char *ptsname (int);
+int grantpt (int);
+int unlockpt (int);
+int posix_openpt (int);
+int posix_memalign (void **, size_t, size_t);
+extern void * memalign (size_t, size_t);
+extern void * valloc (size_t);
+}
+extern "C" {
+typedef struct
+{
+ int quot;
+ int rem;
+} div_t;
+typedef struct
+{
+ long quot;
+ long rem;
+} ldiv_t;
+typedef struct
+{
+ long long int quot;
+ long long int rem;
+} lldiv_t;
+int __attribute__((__cdecl__)) __locale_mb_cur_max (void);
+void __attribute__((__cdecl__)) abort (void) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) abs (int);
+int __attribute__((__cdecl__)) atexit (void (*__func)(void));
+double __attribute__((__cdecl__)) atof (const char *__nptr);
+float __attribute__((__cdecl__)) atoff (const char *__nptr);
+int __attribute__((__cdecl__)) atoi (const char *__nptr);
+int __attribute__((__cdecl__)) _atoi_r (struct _reent *, const char *__nptr);
+long __attribute__((__cdecl__)) atol (const char *__nptr);
+long __attribute__((__cdecl__)) _atol_r (struct _reent *, const char *__nptr);
+void * __attribute__((__cdecl__)) bsearch (const void * __key, const void * __base, size_t __nmemb, size_t __size, int (__attribute__((__cdecl__)) * _compar) (const void *, const void *));
+void * __attribute__((__cdecl__)) calloc (size_t __nmemb, size_t __size) __attribute__ ((nothrow));
+div_t __attribute__((__cdecl__)) div (int __numer, int __denom);
+void __attribute__((__cdecl__)) exit (int __status) __attribute__ ((noreturn));
+void __attribute__((__cdecl__)) free (void *) __attribute__ ((nothrow));
+char * __attribute__((__cdecl__)) getenv (const char *__string);
+char * __attribute__((__cdecl__)) _getenv_r (struct _reent *, const char *__string);
+char * __attribute__((__cdecl__)) _findenv (const char *, int *);
+char * __attribute__((__cdecl__)) _findenv_r (struct _reent *, const char *, int *);
+extern char *suboptarg;
+int __attribute__((__cdecl__)) getsubopt (char **, char * const *, char **);
+long __attribute__((__cdecl__)) labs (long);
+ldiv_t __attribute__((__cdecl__)) ldiv (long __numer, long __denom);
+void * __attribute__((__cdecl__)) malloc (size_t __size) __attribute__ ((nothrow));
+int __attribute__((__cdecl__)) mblen (const char *, size_t);
+int __attribute__((__cdecl__)) _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) mbtowc (wchar_t *, const char *, size_t);
+int __attribute__((__cdecl__)) _mbtowc_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) wctomb (char *, wchar_t);
+int __attribute__((__cdecl__)) _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) mbstowcs (wchar_t *, const char *, size_t);
+size_t __attribute__((__cdecl__)) _mbstowcs_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) wcstombs (char *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) _wcstombs_r (struct _reent *, char *, const wchar_t *, size_t, _mbstate_t *);
+char * __attribute__((__cdecl__)) mkdtemp (char *);
+int __attribute__((__cdecl__)) mkostemp (char *, int);
+int __attribute__((__cdecl__)) mkostemps (char *, int, int);
+int __attribute__((__cdecl__)) mkstemp (char *);
+int __attribute__((__cdecl__)) mkstemps (char *, int);
+char * __attribute__((__cdecl__)) mktemp (char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+char * __attribute__((__cdecl__)) _mkdtemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkostemp_r (struct _reent *, char *, int);
+int __attribute__((__cdecl__)) _mkostemps_r (struct _reent *, char *, int, int);
+int __attribute__((__cdecl__)) _mkstemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkstemps_r (struct _reent *, char *, int);
+char * __attribute__((__cdecl__)) _mktemp_r (struct _reent *, char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+void __attribute__((__cdecl__)) qsort (void * __base, size_t __nmemb, size_t __size, int(*_compar)(const void *, const void *));
+int __attribute__((__cdecl__)) rand (void);
+void * __attribute__((__cdecl__)) realloc (void * __r, size_t __size) __attribute__ ((nothrow));
+void * __attribute__((__cdecl__)) reallocf (void * __r, size_t __size);
+void __attribute__((__cdecl__)) srand (unsigned __seed);
+double __attribute__((__cdecl__)) strtod (const char *__n, char **__end_PTR);
+double __attribute__((__cdecl__)) _strtod_r (struct _reent *,const char *__n, char **__end_PTR);
+float __attribute__((__cdecl__)) strtof (const char *__n, char **__end_PTR);
+long __attribute__((__cdecl__)) strtol (const char *__n, char **__end_PTR, int __base);
+long __attribute__((__cdecl__)) _strtol_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) strtoul (const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) _strtoul_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+int __attribute__((__cdecl__)) system (const char *__string);
+long __attribute__((__cdecl__)) a64l (const char *__input);
+char * __attribute__((__cdecl__)) l64a (long __input);
+char * __attribute__((__cdecl__)) _l64a_r (struct _reent *,long __input);
+int __attribute__((__cdecl__)) on_exit (void (*__func)(int, void *),void * __arg);
+void __attribute__((__cdecl__)) _Exit (int __status) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) putenv (char *__string);
+int __attribute__((__cdecl__)) _putenv_r (struct _reent *, char *__string);
+void * __attribute__((__cdecl__)) _reallocf_r (struct _reent *, void *, size_t);
+int __attribute__((__cdecl__)) setenv (const char *__string, const char *__value, int __overwrite);
+int __attribute__((__cdecl__)) _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite);
+char * __attribute__((__cdecl__)) gcvt (double,int,char *);
+char * __attribute__((__cdecl__)) gcvtf (float,int,char *);
+char * __attribute__((__cdecl__)) fcvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) fcvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) fcvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) ecvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) dtoa (double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) rand_r (unsigned *__seed);
+double __attribute__((__cdecl__)) drand48 (void);
+double __attribute__((__cdecl__)) _drand48_r (struct _reent *);
+double __attribute__((__cdecl__)) erand48 (unsigned short [3]);
+double __attribute__((__cdecl__)) _erand48_r (struct _reent *, unsigned short [3]);
+long __attribute__((__cdecl__)) jrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _jrand48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) lcong48 (unsigned short [7]);
+void __attribute__((__cdecl__)) _lcong48_r (struct _reent *, unsigned short [7]);
+long __attribute__((__cdecl__)) lrand48 (void);
+long __attribute__((__cdecl__)) _lrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) mrand48 (void);
+long __attribute__((__cdecl__)) _mrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) nrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _nrand48_r (struct _reent *, unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) seed48 (unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) _seed48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) srand48 (long);
+void __attribute__((__cdecl__)) _srand48_r (struct _reent *, long);
+long long __attribute__((__cdecl__)) atoll (const char *__nptr);
+long long __attribute__((__cdecl__)) _atoll_r (struct _reent *, const char *__nptr);
+long long __attribute__((__cdecl__)) llabs (long long);
+lldiv_t __attribute__((__cdecl__)) lldiv (long long __numer, long long __denom);
+long long __attribute__((__cdecl__)) strtoll (const char *__n, char **__end_PTR, int __base);
+long long __attribute__((__cdecl__)) _strtoll_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) strtoull (const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) _strtoull_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+char * __attribute__((__cdecl__)) _dtoa_r (struct _reent *, double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) _system_r (struct _reent *, const char *);
+void __attribute__((__cdecl__)) __eprintf (const char *, const char *, unsigned int, const char *);
+}
+namespace std {
+ using ::div_t;
+ using ::ldiv_t;
+ using ::abort;
+ using ::abs;
+ using ::atexit;
+ using ::atof;
+ using ::atoi;
+ using ::atol;
+ using ::bsearch;
+ using ::calloc;
+ using ::div;
+ using ::exit;
+ using ::free;
+ using ::getenv;
+ using ::labs;
+ using ::ldiv;
+ using ::malloc;
+ using ::mblen;
+ using ::mbstowcs;
+ using ::mbtowc;
+ using ::qsort;
+ using ::rand;
+ using ::realloc;
+ using ::srand;
+ using ::strtod;
+ using ::strtol;
+ using ::strtoul;
+ using ::system;
+ using ::wcstombs;
+ using ::wctomb;
+ inline long
+ abs(long __i) { return labs(__i); }
+ inline ldiv_t
+ div(long __i, long __j) { return ldiv(__i, __j); }
+}
+
+
+namespace std {
+ template<typename _FIter, typename _Tp>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ copy(_IIter, _IIter, _OIter);
+ template<typename _BIter1, typename _BIter2>
+ _BIter2
+ copy_backward(_BIter1, _BIter1, _BIter2);
+ template<typename _FIter, typename _Tp>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _FIter, typename _Tp>
+ void
+ fill(_FIter, _FIter, const _Tp&);
+ template<typename _OIter, typename _Size, typename _Tp>
+ _OIter
+ fill_n(_OIter, _Size, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _BIter>
+ void
+ inplace_merge(_BIter, _BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ void
+ inplace_merge(_BIter, _BIter, _BIter, _Compare);
+ template<typename _FIter1, typename _FIter2>
+ void
+ iter_swap(_FIter1, _FIter2);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _RAIter>
+ void
+ make_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ make_heap(_RAIter, _RAIter, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ max(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ max(const _Tp&, const _Tp&, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ min(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ min(const _Tp&, const _Tp&, _Compare);
+ template<typename _BIter>
+ bool
+ next_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ next_permutation(_BIter, _BIter, _Compare);
+ template<typename _IIter, typename _RAIter>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
+ template<typename _IIter, typename _RAIter, typename _Compare>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ pop_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ pop_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter>
+ bool
+ prev_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ prev_permutation(_BIter, _BIter, _Compare);
+ template<typename _RAIter>
+ void
+ push_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ push_heap(_RAIter, _RAIter, _Compare);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ remove(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Predicate>
+ _FIter
+ remove_if(_FIter, _FIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ remove_copy(_IIter, _IIter, _OIter, const _Tp&);
+ template<typename _IIter, typename _OIter, typename _Predicate>
+ _OIter
+ remove_copy_if(_IIter, _IIter, _OIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);
+ template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
+ _OIter
+ replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);
+ template<typename _BIter>
+ void
+ reverse(_BIter, _BIter);
+ template<typename _BIter, typename _OIter>
+ _OIter
+ reverse_copy(_BIter, _BIter, _OIter);
+ template<typename _FIter>
+ void
+ rotate(_FIter, _FIter, _FIter);
+ template<typename _FIter, typename _OIter>
+ _OIter
+ rotate_copy(_FIter, _FIter, _FIter, _OIter);
+ template<typename _RAIter>
+ void
+ sort_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ stable_partition(_BIter, _BIter, _Predicate);
+ template<typename _Tp>
+ void
+ swap(_Tp&, _Tp&);
+ template<typename _Tp, size_t _Nm>
+ void
+ swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
+ template<typename _FIter1, typename _FIter2>
+ _FIter2
+ swap_ranges(_FIter1, _FIter1, _FIter2);
+ template<typename _FIter>
+ _FIter
+ unique(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ unique(_FIter, _FIter, _BinaryPredicate);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&, _Compare);
+}
+namespace std {
+ template<typename _FIter>
+ _FIter
+ adjacent_find(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ adjacent_find(_FIter, _FIter, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ typename iterator_traits<_IIter>::difference_type
+ count(_IIter, _IIter, const _Tp&);
+ template<typename _IIter, typename _Predicate>
+ typename iterator_traits<_IIter>::difference_type
+ count_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ equal(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ bool
+ equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ _IIter
+ find(_IIter, _IIter, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Predicate>
+ _IIter
+ find_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter, typename _Funct>
+ _Funct
+ for_each(_IIter, _IIter, _Funct);
+ template<typename _FIter, typename _Generator>
+ void
+ generate(_FIter, _FIter, _Generator);
+ template<typename _OIter, typename _Size, typename _Generator>
+ _OIter
+ generate_n(_OIter, _Size, _Generator);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _FIter>
+ _FIter
+ max_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ max_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _FIter>
+ _FIter
+ min_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ min_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _RAIter>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ partition(_BIter, _BIter, _Predicate);
+ template<typename _RAIter>
+ void
+ random_shuffle(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Generator>
+ void
+ random_shuffle(_RAIter, _RAIter,
+ _Generator&);
+ template<typename _FIter, typename _Tp>
+ void
+ replace(_FIter, _FIter, const _Tp&, const _Tp&);
+ template<typename _FIter, typename _Predicate, typename _Tp>
+ void
+ replace_if(_FIter, _FIter, _Predicate, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _FIter, typename _Size, typename _Tp>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&);
+ template<typename _FIter, typename _Size, typename _Tp,
+ typename _BinaryPredicate>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
+ _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _RAIter>
+ void
+ sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort(_RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ stable_sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ stable_sort(_RAIter, _RAIter, _Compare);
+ template<typename _IIter, typename _OIter, typename _UnaryOperation>
+ _OIter
+ transform(_IIter, _IIter, _OIter, _UnaryOperation);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _BinaryOperation>
+ _OIter
+ transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter);
+ template<typename _IIter, typename _OIter, typename _BinaryPredicate>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
+}
+namespace std {
+ template<typename _RandomAccessIterator, typename _Distance>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__first[__parent] < __first[__child])
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n,
+ _Compare __comp)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__comp(__first[__parent], __first[__child]))
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Distance __n)
+ { return std::__is_heap_until(__first, __n) == __n; }
+ template<typename _RandomAccessIterator, typename _Compare,
+ typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)
+ { return std::__is_heap_until(__first, __n, __comp) == __n; }
+ template<typename _RandomAccessIterator>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ { return std::__is_heap(__first, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ { return std::__is_heap(__first, __comp, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __push_heap(_RandomAccessIterator __first,
+ _Distance __holeIndex, _Distance __topIndex, _Tp __value)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex && *(__first + __parent) < __value)
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value));
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
+ typename _Compare>
+ void
+ __push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __topIndex, _Tp __value, _Compare __comp)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex
+ && __comp(*(__first + __parent), __value))
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Tp, typename _Compare>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value, _Compare __comp)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (__comp(*(__first + __secondChild),
+ *(__first + (__secondChild - 1))))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value));
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value),
+ __comp);
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ }
+}
+
+
+
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class exception
+ {
+ public:
+ exception() throw() { }
+ virtual ~exception() throw();
+ virtual const char* what() const throw();
+ };
+ class bad_exception : public exception
+ {
+ public:
+ bad_exception() throw() { }
+ virtual ~bad_exception() throw();
+ virtual const char* what() const throw();
+ };
+ typedef void (*terminate_handler) ();
+ typedef void (*unexpected_handler) ();
+ terminate_handler set_terminate(terminate_handler) throw();
+ void terminate() throw() __attribute__ ((__noreturn__));
+ unexpected_handler set_unexpected(unexpected_handler) throw();
+ void unexpected() __attribute__ ((__noreturn__));
+ bool uncaught_exception() throw() __attribute__ ((__pure__));
+}
+namespace __gnu_cxx {
+ void __verbose_terminate_handler();
+}
+}
+#pragma GCC visibility pop
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class bad_alloc : public exception
+ {
+ public:
+ bad_alloc() throw() { }
+ virtual ~bad_alloc() throw();
+ virtual const char* what() const throw();
+ };
+ struct nothrow_t { };
+ extern const nothrow_t nothrow;
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler) throw();
+}
+void* operator new(std::size_t) throw (std::bad_alloc);
+void* operator new[](std::size_t) throw (std::bad_alloc);
+void operator delete(void*) throw();
+void operator delete[](void*) throw();
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { }
+inline void operator delete[](void*, void*) throw() { }
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _T1, typename _T2>
+ inline void
+ _Construct(_T1* __p, const _T2& __value)
+ {
+ ::new(static_cast<void*>(__p)) _T1((__value));
+ }
+ template<typename _Tp>
+ inline void
+ _Destroy(_Tp* __pointer)
+ { __pointer->~_Tp(); }
+ template<bool>
+ struct _Destroy_aux
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ for (; __first != __last; ++__first)
+ std::_Destroy(&*__first);
+ }
+ };
+ template<>
+ struct _Destroy_aux<true>
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator, _ForwardIterator) { }
+ };
+ template<typename _ForwardIterator>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _Value_type;
+ std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
+ __destroy(__first, __last);
+ }
+ template <typename _Tp> class allocator;
+ template<typename _ForwardIterator, typename _Allocator>
+ void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ _Allocator& __alloc)
+ {
+ for (; __first != __last; ++__first)
+ __alloc.destroy(&*__first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ allocator<_Tp>&)
+ {
+ _Destroy(__first, __last);
+ }
+}
+namespace std {
+ template<bool>
+ struct __uninitialized_copy
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ std::_Construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_copy<true>
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ { return std::copy(__first, __last, __result); }
+ };
+ template<typename _InputIterator, typename _ForwardIterator>
+ inline _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType2;
+ return std::__uninitialized_copy<(__is_pod(_ValueType1)
+ && __is_pod(_ValueType2))>::
+ uninitialized_copy(__first, __last, __result);
+ }
+ template<bool>
+ struct __uninitialized_fill
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ { std::fill(__first, __last, __x); }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill<__is_pod(_ValueType)>::
+ uninitialized_fill(__first, __last, __x);
+ }
+ template<bool>
+ struct __uninitialized_construct_range_dispatch
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator __first, _ForwardIterator __last,
+ _Tp& __value)
+ {
+ if(__first == __last)
+ return;
+ _ForwardIterator __cur = __first;
+ try
+ {
+ std::_Construct(&*__first, (__value));
+ _ForwardIterator __prev = __cur;
+ ++__cur;
+ for(; __cur != __last; ++__cur, ++__prev)
+ std::_Construct(&*__cur, (*__prev));
+ __value = (*__prev);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_construct_range_dispatch<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ __uninitialized_construct_range(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Tp& __value)
+ {
+ typedef typename std::iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_construct_range_dispatch<
+ __has_trivial_constructor(_ValueType)>::
+ __ucr(__first, __last, __value);
+ }
+ template<bool>
+ struct __uninitialized_fill_n
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill_n<true>
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ { std::fill_n(__first, __n, __x); }
+ };
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ inline void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill_n<__is_pod(_ValueType)>::
+ uninitialized_fill_n(__first, __n, __x);
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ __alloc.construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
+ inline _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, allocator<_Tp>&)
+ { return std::uninitialized_copy(__first, __last, __result); }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ return std::__uninitialized_copy_a((__first),
+ (__last),
+ __result, __alloc);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Allocator>
+ void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Tp2>
+ inline void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill(__first, __last, __x); }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Allocator>
+ void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Tp2>
+ inline void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill_n(__first, __n, __x); }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_copy_move(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_copy(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
+ const _Tp& __x, _InputIterator __first,
+ _InputIterator __last, _Allocator& __alloc)
+ {
+ std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
+ typename _Allocator>
+ inline void
+ __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2,
+ _ForwardIterator __last2, const _Tp& __x,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
+ __first2,
+ __alloc);
+ try
+ {
+ std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first2, __mid2, __alloc);
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Tp>
+ pair<_Tp*, ptrdiff_t>
+ get_temporary_buffer(ptrdiff_t __len)
+ {
+ const ptrdiff_t __max =
+ __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
+ if (__len > __max)
+ __len = __max;
+ while (__len > 0)
+ {
+ _Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
+ std::nothrow));
+ if (__tmp != 0)
+ return std::pair<_Tp*, ptrdiff_t>(__tmp, __len);
+ __len /= 2;
+ }
+ return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
+ }
+ template<typename _Tp>
+ inline void
+ return_temporary_buffer(_Tp* __p)
+ { ::operator delete(__p, std::nothrow); }
+ template<typename _ForwardIterator, typename _Tp>
+ class _Temporary_buffer
+ {
+
+ public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef pointer iterator;
+ typedef ptrdiff_t size_type;
+ protected:
+ size_type _M_original_len;
+ size_type _M_len;
+ pointer _M_buffer;
+ public:
+ size_type
+ size() const
+ { return _M_len; }
+ size_type
+ requested_size() const
+ { return _M_original_len; }
+ iterator
+ begin()
+ { return _M_buffer; }
+ iterator
+ end()
+ { return _M_buffer + _M_len; }
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last);
+ ~_Temporary_buffer()
+ {
+ std::_Destroy(_M_buffer, _M_buffer + _M_len);
+ std::return_temporary_buffer(_M_buffer);
+ }
+ private:
+ _Temporary_buffer(const _Temporary_buffer&);
+ void
+ operator=(const _Temporary_buffer&);
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ _Temporary_buffer<_ForwardIterator, _Tp>::
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+ : _M_original_len(std::distance(__first, __last)),
+ _M_len(0), _M_buffer(0)
+ {
+ try
+ {
+ std::pair<pointer, size_type> __p(std::get_temporary_buffer<
+ value_type>(_M_original_len));
+ _M_buffer = __p.first;
+ _M_len = __p.second;
+ if(_M_buffer)
+ std::__uninitialized_construct_range(_M_buffer, _M_buffer + _M_len,
+ *__first);
+ }
+ catch(...)
+ {
+ std::return_temporary_buffer(_M_buffer);
+ _M_buffer = 0;
+ _M_len = 0;
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
+ {
+
+ if (*__a < *__b)
+ {
+ if (*__b < *__c)
+ std::iter_swap(__a, __b);
+ else if (*__a < *__c)
+ std::iter_swap(__a, __c);
+ }
+ else if (*__a < *__c)
+ return;
+ else if (*__b < *__c)
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _Iterator, typename _Compare>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
+ _Compare __comp)
+ {
+
+ if (__comp(*__a, *__b))
+ {
+ if (__comp(*__b, *__c))
+ std::iter_swap(__a, __b);
+ else if (__comp(*__a, *__c))
+ std::iter_swap(__a, __c);
+ }
+ else if (__comp(*__a, *__c))
+ return;
+ else if (__comp(*__b, *__c))
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ __find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val, input_iterator_tag)
+ {
+ while (__first != __last && !(*__first == __val))
+ ++__first;
+ return __first;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ __find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred, input_iterator_tag)
+ {
+ while (__first != __last && !bool(__pred(*__first)))
+ ++__first;
+ return __first;
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ const _Tp& __val, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 2:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 1:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Predicate>
+ _RandomAccessIterator
+ __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Predicate __pred, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 2:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 1:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ std::forward_iterator_tag)
+ {
+ __first = std::find(__first, __last, __val);
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && *__i == __val)
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = std::find(++__i, __last, __val);
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!(*__lookAhead == __val))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ *__backTrack == __val; --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::forward_iterator_tag)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = ++__i;
+ while (__first != __last
+ && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!bool(__binary_pred(*__lookAhead, __val)))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ __binary_pred(*__backTrack, __val); --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2, __last2);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2,
+ __last2, __comp);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1),
+ __rlast1,
+ _RevIterator2(__last2),
+ __rlast2);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BinaryPredicate>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
+ _RevIterator2(__last2), __rlast2,
+ __comp);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2));
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2),
+ __comp);
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ remove_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, const _Tp& __value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!(*__first == __value))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate>
+ _OutputIterator
+ remove_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Predicate __pred)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!bool(__pred(*__first)))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ remove(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+
+
+ ;
+ __first = std::find(__first, __last, __value);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!(*__first == __value))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ remove_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ __first = std::find_if(__first, __last, __pred);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!bool(__pred(*__first)))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!(*__dest == *__first))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last, __binary_pred);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__dest, *__first)))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result,
+ forward_iterator_tag, output_iterator_tag)
+ {
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!(*__first == *__next))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ input_iterator_tag, output_iterator_tag)
+ {
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!(__value == *__first))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result,
+ input_iterator_tag, forward_iterator_tag)
+ {
+ *__result = *__first;
+ while (++__first != __last)
+ if (!(*__result == *__first))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ forward_iterator_tag, output_iterator_tag)
+ {
+
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!bool(__binary_pred(*__first, *__next)))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, output_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!bool(__binary_pred(__value, *__first)))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, forward_iterator_tag)
+ {
+
+ *__result = *__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__result, *__first)))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+ while (true)
+ if (__first == __last || __first == --__last)
+ return;
+ else
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+ if (__first == __last)
+ return;
+ --__last;
+ while (__first < __last)
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ --__last;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ inline void
+ reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
+ {
+
+ ;
+ std::__reverse(__first, __last, std::__iterator_category(__first));
+ }
+ template<typename _BidirectionalIterator, typename _OutputIterator>
+ _OutputIterator
+ reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _OutputIterator __result)
+ {
+
+
+ ;
+ while (__first != __last)
+ {
+ --__last;
+ *__result = *__last;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _EuclideanRingElement>
+ _EuclideanRingElement
+ __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
+ {
+ while (__n != 0)
+ {
+ _EuclideanRingElement __t = __m % __n;
+ __m = __n;
+ __n = __t;
+ }
+ return __m;
+ }
+ template<typename _ForwardIterator>
+ void
+ __rotate(_ForwardIterator __first,
+ _ForwardIterator __middle,
+ _ForwardIterator __last,
+ forward_iterator_tag)
+ {
+ if (__first == __middle || __last == __middle)
+ return;
+ _ForwardIterator __first2 = __middle;
+ do
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ }
+ while (__first2 != __last);
+ __first2 = __middle;
+ while (__first2 != __last)
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ else if (__first2 == __last)
+ __first2 = __middle;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __rotate(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ while (__first != __middle && __middle != __last)
+ {
+ std::iter_swap(__first, --__last);
+ ++__first;
+ }
+ if (__first == __middle)
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ else
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __rotate(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ _Distance __n = __last - __first;
+ _Distance __k = __middle - __first;
+ if (__k == __n - __k)
+ {
+ std::swap_ranges(__first, __middle, __middle);
+ return;
+ }
+ _RandomAccessIterator __p = __first;
+ for (;;)
+ {
+ if (__k < __n - __k)
+ {
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*__p);
+ std::copy(__p + 1, __p + __n, __p);
+ *(__p + __n - 1) = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ std::iter_swap(__p, __q);
+ ++__p;
+ ++__q;
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ __k = __n - __k;
+ }
+ else
+ {
+ __k = __n - __k;
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*(__p + __n - 1));
+ std::copy_backward(__p, __p + __n - 1, __p + __n);
+ *__p = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __n;
+ __p = __q - __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ --__p;
+ --__q;
+ std::iter_swap(__p, __q);
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ }
+ }
+ }
+ template<typename _ForwardIterator>
+ inline void
+ rotate(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last)
+ {
+
+ ;
+ ;
+ typedef typename iterator_traits<_ForwardIterator>::iterator_category
+ _IterType;
+ std::__rotate(__first, __middle, __last, _IterType());
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last, _OutputIterator __result)
+ {
+
+
+ ;
+ ;
+ return std::copy(__first, __middle,
+ std::copy(__middle, __last, __result));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ __partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, forward_iterator_tag)
+ {
+ if (__first == __last)
+ return __first;
+ while (__pred(*__first))
+ if (++__first == __last)
+ return __first;
+ _ForwardIterator __next = __first;
+ while (++__next != __last)
+ if (__pred(*__next))
+ {
+ std::iter_swap(__first, __next);
+ ++__first;
+ }
+ return __first;
+ }
+ template<typename _BidirectionalIterator, typename _Predicate>
+ _BidirectionalIterator
+ __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _Predicate __pred, bidirectional_iterator_tag)
+ {
+ while (true)
+ {
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (__pred(*__first))
+ ++__first;
+ else
+ break;
+ --__last;
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (!bool(__pred(*__last)))
+ --__last;
+ else
+ break;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Distance>
+ _ForwardIterator
+ __inplace_stable_partition(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len)
+ {
+ if (__len == 1)
+ return __pred(*__first) ? __last : __first;
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin = std::__inplace_stable_partition(__first,
+ __middle,
+ __pred,
+ __len / 2);
+ _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
+ __pred,
+ __len
+ - __len / 2);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
+ typename _Distance>
+ _ForwardIterator
+ __stable_partition_adaptive(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len,
+ _Pointer __buffer,
+ _Distance __buffer_size)
+ {
+ if (__len <= __buffer_size)
+ {
+ _ForwardIterator __result1 = __first;
+ _Pointer __result2 = __buffer;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ {
+ *__result1 = (*__first);
+ ++__result1;
+ }
+ else
+ {
+ *__result2 = (*__first);
+ ++__result2;
+ }
+ std::copy(__buffer, __result2, __result1);
+ return __result1;
+ }
+ else
+ {
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin =
+ std::__stable_partition_adaptive(__first, __middle, __pred,
+ __len / 2, __buffer,
+ __buffer_size);
+ _ForwardIterator __end =
+ std::__stable_partition_adaptive(__middle, __last, __pred,
+ __len - __len / 2,
+ __buffer, __buffer_size);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ stable_partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ else
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+ _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.size() > 0)
+ return
+ std::__stable_partition_adaptive(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()),
+ __buf.begin(),
+ _DistanceType(__buf.size()));
+ else
+ return
+ std::__inplace_stable_partition(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()));
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ std::make_heap(__first, __middle);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (*__i < *__first)
+ std::__pop_heap(__first, __middle, __i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ std::make_heap(__first, __middle, __comp);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (__comp(*__i, *__first))
+ std::__pop_heap(__first, __middle, __i, __comp);
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last);
+ while (__first != __last)
+ {
+ if (*__first < *__result_first)
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first));
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last);
+ return __result_real_last;
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last, __comp);
+ while (__first != __last)
+ {
+ if (__comp(*__first, *__result_first))
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first),
+ __comp);
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last, __comp);
+ return __result_real_last;
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__val < *__next)
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__comp(__val, *__next))
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (*__i < *__first)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__first == __last) return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (__comp(*__i, *__first))
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ enum { _S_threshold = 16 };
+ template<typename _RandomAccessIterator>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold));
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
+ }
+ else
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
+ __comp);
+ }
+ else
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, const _Tp& __pivot)
+ {
+ while (true)
+ {
+ while (*__first < __pivot)
+ ++__first;
+ --__last;
+ while (__pivot < *__last)
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ const _Tp& __pivot, _Compare __comp)
+ {
+ while (true)
+ {
+ while (__comp(*__first, __pivot))
+ ++__first;
+ --__last;
+ while (__comp(__pivot, *__last))
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1));
+ return std::__unguarded_partition(__first + 1, __last, *__first);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1), __comp);
+ return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ std::__introsort_loop(__cut, __last, __depth_limit);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit, _Compare __comp)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last, __comp);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ std::__introsort_loop(__cut, __last, __depth_limit, __comp);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last, __comp);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val, __comp);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val, __comp);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val);
+ return __i != __last && !(__val < *__i);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
+ return __i != __last && !bool(__comp(__val, *__i));
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (*__last2 < *__last1)
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3, typename _Compare>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result,
+ _Compare __comp)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (__comp(*__last2, *__last1))
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _Distance>
+ _BidirectionalIterator1
+ __rotate_adaptive(_BidirectionalIterator1 __first,
+ _BidirectionalIterator1 __middle,
+ _BidirectionalIterator1 __last,
+ _Distance __len1, _Distance __len2,
+ _BidirectionalIterator2 __buffer,
+ _Distance __buffer_size)
+ {
+ _BidirectionalIterator2 __buffer_end;
+ if (__len1 > __len2 && __len2 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__middle, __last, __buffer);
+ std::copy_backward(__first, __middle, __last);
+ return std::copy(__buffer, __buffer_end, __first);
+ }
+ else if (__len1 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__first, __middle, __buffer);
+ std::copy(__middle, __last, __first);
+ return std::copy_backward(__buffer, __buffer_end, __last);
+ }
+ else
+ {
+ std::rotate(__first, __middle, __last);
+ std::advance(__first, std::distance(__middle, __last));
+ return __first;
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last,
+ *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle,
+ *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer, __buffer_size);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer, typename _Compare>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first, __comp);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last,__comp);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size, __comp);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer,
+ __buffer_size, __comp);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (*__middle < *__first)
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22);
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Compare>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Compare __comp)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (__comp(*__middle, *__first))
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22, __comp);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22, __comp);
+ }
+ template<typename _BidirectionalIterator>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ _DistanceType __len1 = std::distance(__first, __middle);
+ _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()));
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ const _DistanceType __len1 = std::distance(__first, __middle);
+ const _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1,
+ __len2, __comp);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()),
+ __comp);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result,
+ _Distance __step_size)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance, typename _Compare>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result, _Distance __step_size,
+ _Compare __comp)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result, __comp);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size, _Compare __comp)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size, __comp);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ enum { _S_chunk_size = 7 };
+ template<typename _RandomAccessIterator, typename _Pointer>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer, __step_size);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer,
+ __step_size, __comp);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first,
+ __step_size, __comp);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle,
+ __buffer, __buffer_size);
+ std::__stable_sort_adaptive(__middle, __last,
+ __buffer, __buffer_size);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size);
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance, typename _Compare>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle, __buffer,
+ __buffer_size, __comp);
+ std::__stable_sort_adaptive(__middle, __last, __buffer,
+ __buffer_size, __comp);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size,
+ __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle);
+ std::__inplace_stable_sort(__middle, __last);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last, __comp);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle, __comp);
+ std::__inplace_stable_sort(__middle, __last, __comp);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle,
+ __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first2 < *__first1)
+ return false;
+ else if(*__first1 < *__first2)
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _Compare>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1))
+ return false;
+ else if(__comp(*__first1, *__first2))
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__i < *__ii)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*__i < *--__j))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__i, *__ii))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*__i, *--__j)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__ii < *__i)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*--__j < *__i))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__ii, *__i))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*--__j, *__i)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ replace_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (*__first == __old_value)
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate, typename _Tp>
+ _OutputIterator
+ replace_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (__pred(*__first))
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+}
+namespace std {
+ template<typename _InputIterator, typename _Function>
+ _Function
+ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
+ {
+
+ ;
+ for (; __first != __last; ++__first)
+ __f(*__first);
+ return (__f);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val)
+ {
+
+
+ ;
+ return std::__find(__first, __last, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__find_if(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (*__first1 == *__iter)
+ return __first1;
+ return __last1;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (__comp(*__first1, *__iter))
+ return __first1;
+ return __last1;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (*__first == *__next)
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (__binary_pred(*__first, *__next))
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _InputIterator, typename _Tp>
+ typename iterator_traits<_InputIterator>::difference_type
+ count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (*__first == __value)
+ ++__n;
+ return __n;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ typename iterator_traits<_InputIterator>::difference_type
+ count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ ++__n;
+ return __n;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ return std::find(__first1, __last1, *__first2);
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ __first1 = std::find(__first1, __last1, *__first2);
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (*__current == *__p)
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __predicate)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ return __first1;
+ }
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (__predicate(*__current, *__p))
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ return std::find(__first, __last, __val);
+ return std::__search_n(__first, __last, __count, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ return __first;
+ }
+ return std::__search_n(__first, __last, __count, __val, __binary_pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _UnaryOperation>
+ _OutputIterator
+ transform(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _UnaryOperation __unary_op)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ *__result = __unary_op(*__first);
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _BinaryOperation>
+ _OutputIterator
+ transform(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _OutputIterator __result,
+ _BinaryOperation __binary_op)
+ {
+
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
+ *__result = __binary_op(*__first1, *__first2);
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ void
+ replace(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (*__first == __old_value)
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Tp>
+ void
+ replace_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Generator>
+ void
+ generate(_ForwardIterator __first, _ForwardIterator __last,
+ _Generator __gen)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first)
+ *__first = __gen();
+ }
+ template<typename _OutputIterator, typename _Size, typename _Generator>
+ _OutputIterator
+ generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
+ {
+
+ for (; __n > 0; --__n, ++__first)
+ *__first = __gen();
+ return __first;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ {
+
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result, __binary_pred,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+ ;
+ if (__first != __last)
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
+ }
+ template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
+ void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomNumberGenerator& __rand)
+ {
+
+ ;
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + __rand((__i - __first) + 1));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ inline _ForwardIterator
+ partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__partition(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last);
+ std::sort_heap(__first, __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last, __comp);
+ std::sort_heap(__first, __middle, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2);
+ std::__final_insertion_sort(__first, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ std::__final_insertion_sort(__first, __last, __comp);
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()));
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last, __comp);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()), __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ ++__first1;
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ ++__first1;
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1,
+ __last1, __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2,
+ std::copy(__first1, __last1, __result));
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__first < *__result)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__first, *__result))
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__result < *__first)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last) return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__result, *__first))
+ __result = __first;
+ return __result;
+ }
+}
+
+
+
+
+
+namespace std {
+ template<typename _Alloc>
+ class allocator;
+ template<class _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_string;
+ template<> struct char_traits<char>;
+ typedef basic_string<char> string;
+ template<> struct char_traits<wchar_t>;
+ typedef basic_string<wchar_t> wstring;
+}
+
+
+
+typedef __builtin_va_list __gnuc_va_list;
+extern "C" {
+struct tm;
+typedef _mbstate_t mbstate_t;
+wint_t __attribute__((__cdecl__)) btowc (int);
+int __attribute__((__cdecl__)) wctob (wint_t);
+size_t __attribute__((__cdecl__)) mbrlen (const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbrtowc (wchar_t * , const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbrtowc_r (struct _reent *, wchar_t * , const char * , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) mbsinit (const mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsnrtowcs (wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsnrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsrtowcs (wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcrtomb (char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcrtomb_r (struct _reent *, char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsnrtombs (char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsnrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsrtombs (char * , const wchar_t ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) wcscasecmp (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscat (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcschr (const wchar_t *, wchar_t);
+int __attribute__((__cdecl__)) wcscmp (const wchar_t *, const wchar_t *);
+int __attribute__((__cdecl__)) wcscoll (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcpcpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsdup (const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) _wcsdup_r (struct _reent *, const wchar_t * );
+size_t __attribute__((__cdecl__)) wcscspn (const wchar_t *, const wchar_t *);
+size_t __attribute__((__cdecl__)) wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *);
+size_t __attribute__((__cdecl__)) wcslcat (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslcpy (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslen (const wchar_t *);
+int __attribute__((__cdecl__)) wcsncasecmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncat (wchar_t * , const wchar_t * , size_t);
+int __attribute__((__cdecl__)) wcsncmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wcpncpy (wchar_t * , const wchar_t * , size_t);
+size_t __attribute__((__cdecl__)) wcsnlen (const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcspbrk (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsrchr (const wchar_t *, wchar_t);
+size_t __attribute__((__cdecl__)) wcsspn (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsstr (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcstok (wchar_t *, const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) wcstod (const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) _wcstod_r (struct _reent *, const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) wcstof (const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) _wcstof_r (struct _reent *, const wchar_t *, wchar_t **);
+int __attribute__((__cdecl__)) wcswidth (const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcsxfrm (wchar_t *, const wchar_t *, size_t);
+int __attribute__((__cdecl__)) wcwidth (const wchar_t);
+wchar_t *__attribute__((__cdecl__)) wmemchr (const wchar_t *, wchar_t, size_t);
+int __attribute__((__cdecl__)) wmemcmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemcpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wmemmove (wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemset (wchar_t *, wchar_t, size_t);
+long __attribute__((__cdecl__)) wcstol (const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) wcstoll (const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) wcstoul (const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) wcstoull (const wchar_t *, wchar_t **, int);
+long __attribute__((__cdecl__)) _wcstol_r (struct _reent *, const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) _wcstoll_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) _wcstoul_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) _wcstoull_r (struct _reent *, const wchar_t *, wchar_t **, int);
+wint_t __attribute__((__cdecl__)) fgetwc (__FILE *);
+wchar_t *__attribute__((__cdecl__)) fgetws (wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) fputwc (wchar_t, __FILE *);
+int __attribute__((__cdecl__)) fputws (const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) fwide (__FILE *, int);
+wint_t __attribute__((__cdecl__)) getwc (__FILE *);
+wint_t __attribute__((__cdecl__)) getwchar (void);
+wint_t __attribute__((__cdecl__)) putwc (wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) putwchar (wchar_t);
+wint_t __attribute__((__cdecl__)) ungetwc (wint_t wc, __FILE *);
+wint_t __attribute__((__cdecl__)) _fgetwc_r (struct _reent *, __FILE *);
+wchar_t *__attribute__((__cdecl__)) _fgetws_r (struct _reent *, wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) _fputwc_r (struct _reent *, wchar_t, __FILE *);
+int __attribute__((__cdecl__)) _fputws_r (struct _reent *, const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) _fwide_r (struct _reent *, __FILE *, int);
+wint_t __attribute__((__cdecl__)) _getwc_r (struct _reent *, __FILE *);
+wint_t __attribute__((__cdecl__)) _getwchar_r (struct _reent *ptr);
+wint_t __attribute__((__cdecl__)) _putwc_r (struct _reent *, wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) _putwchar_r (struct _reent *, wchar_t);
+wint_t __attribute__((__cdecl__)) _ungetwc_r (struct _reent *, wint_t wc, __FILE *);
+__FILE *__attribute__((__cdecl__)) open_wmemstream (wchar_t **, size_t *);
+__FILE *__attribute__((__cdecl__)) _open_wmemstream_r (struct _reent *, wchar_t **, size_t *);
+int __attribute__((__cdecl__)) fwprintf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swprintf (wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwprintf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswprintf (wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwprintf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wprintf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwprintf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwprintf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwprintf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wprintf_r (struct _reent *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) fwscanf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swscanf (const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwscanf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswscanf (const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwscanf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wscanf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwscanf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swscanf_r (struct _reent *, const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwscanf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswscanf_r (struct _reent *, const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwscanf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wscanf_r (struct _reent *, const wchar_t *, ...);
+}
+namespace std {
+ using ::mbstate_t;
+}
+namespace std {
+ using ::wint_t;
+ using ::btowc;
+ using ::fgetwc;
+ using ::fgetws;
+ using ::fputwc;
+ using ::fputws;
+ using ::fwide;
+ using ::fwprintf;
+ using ::fwscanf;
+ using ::getwc;
+ using ::getwchar;
+ using ::mbrlen;
+ using ::mbrtowc;
+ using ::mbsinit;
+ using ::mbsrtowcs;
+ using ::putwc;
+ using ::putwchar;
+ using ::swprintf;
+ using ::swscanf;
+ using ::ungetwc;
+ using ::vfwprintf;
+ using ::vfwscanf;
+ using ::vswprintf;
+ using ::vswscanf;
+ using ::vwprintf;
+ using ::vwscanf;
+ using ::wcrtomb;
+ using ::wcscat;
+ using ::wcscmp;
+ using ::wcscoll;
+ using ::wcscpy;
+ using ::wcscspn;
+ using ::wcsftime;
+ using ::wcslen;
+ using ::wcsncat;
+ using ::wcsncmp;
+ using ::wcsncpy;
+ using ::wcsrtombs;
+ using ::wcsspn;
+ using ::wcstod;
+ using ::wcstof;
+ using ::wcstok;
+ using ::wcstol;
+ using ::wcstoul;
+ using ::wcsxfrm;
+ using ::wctob;
+ using ::wmemcmp;
+ using ::wmemcpy;
+ using ::wmemmove;
+ using ::wmemset;
+ using ::wprintf;
+ using ::wscanf;
+ using ::wcschr;
+ using ::wcspbrk;
+ using ::wcsrchr;
+ using ::wcsstr;
+ using ::wmemchr;
+ inline wchar_t*
+ wcschr(wchar_t* __p, wchar_t __c)
+ { return wcschr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcspbrk(wchar_t* __s1, const wchar_t* __s2)
+ { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wcsrchr(wchar_t* __p, wchar_t __c)
+ { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcsstr(wchar_t* __s1, const wchar_t* __s2)
+ { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wmemchr(wchar_t* __p, wchar_t __c, size_t __n)
+ { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }
+}
+namespace std {
+ typedef long long streamoff;
+ typedef ptrdiff_t streamsize;
+ template<typename _StateT>
+ class fpos
+ {
+ private:
+ streamoff _M_off;
+ _StateT _M_state;
+ public:
+ fpos()
+ : _M_off(0), _M_state() { }
+ fpos(streamoff __off)
+ : _M_off(__off), _M_state() { }
+ operator streamoff() const { return _M_off; }
+ void
+ state(_StateT __st)
+ { _M_state = __st; }
+ _StateT
+ state() const
+ { return _M_state; }
+ fpos&
+ operator+=(streamoff __off)
+ {
+ _M_off += __off;
+ return *this;
+ }
+ fpos&
+ operator-=(streamoff __off)
+ {
+ _M_off -= __off;
+ return *this;
+ }
+ fpos
+ operator+(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos += __off;
+ return __pos;
+ }
+ fpos
+ operator-(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos -= __off;
+ return __pos;
+ }
+ streamoff
+ operator-(const fpos& __other) const
+ { return _M_off - __other._M_off; }
+ };
+ template<typename _StateT>
+ inline bool
+ operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) == streamoff(__rhs); }
+ template<typename _StateT>
+ inline bool
+ operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) != streamoff(__rhs); }
+ typedef fpos<mbstate_t> streampos;
+ typedef fpos<mbstate_t> wstreampos;
+}
+namespace std {
+ class ios_base;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ios;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_streambuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_istream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_iostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringbuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_istringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_ostringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_filebuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ifstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ofstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_fstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class ostreambuf_iterator;
+ typedef basic_ios<char> ios;
+ typedef basic_streambuf<char> streambuf;
+ typedef basic_istream<char> istream;
+ typedef basic_ostream<char> ostream;
+ typedef basic_iostream<char> iostream;
+ typedef basic_stringbuf<char> stringbuf;
+ typedef basic_istringstream<char> istringstream;
+ typedef basic_ostringstream<char> ostringstream;
+ typedef basic_stringstream<char> stringstream;
+ typedef basic_filebuf<char> filebuf;
+ typedef basic_ifstream<char> ifstream;
+ typedef basic_ofstream<char> ofstream;
+ typedef basic_fstream<char> fstream;
+ typedef basic_ios<wchar_t> wios;
+ typedef basic_streambuf<wchar_t> wstreambuf;
+ typedef basic_istream<wchar_t> wistream;
+ typedef basic_ostream<wchar_t> wostream;
+ typedef basic_iostream<wchar_t> wiostream;
+ typedef basic_stringbuf<wchar_t> wstringbuf;
+ typedef basic_istringstream<wchar_t> wistringstream;
+ typedef basic_ostringstream<wchar_t> wostringstream;
+ typedef basic_stringstream<wchar_t> wstringstream;
+ typedef basic_filebuf<wchar_t> wfilebuf;
+ typedef basic_ifstream<wchar_t> wifstream;
+ typedef basic_ofstream<wchar_t> wofstream;
+ typedef basic_fstream<wchar_t> wfstream;
+}
+
+
+
+namespace __gnu_cxx {
+ template<typename _CharT>
+ struct _Char_types
+ {
+ typedef unsigned long int_type;
+ typedef std::streampos pos_type;
+ typedef std::streamoff off_type;
+ typedef std::mbstate_t state_type;
+ };
+ template<typename _CharT>
+ struct char_traits
+ {
+ typedef _CharT char_type;
+ typedef typename _Char_types<_CharT>::int_type int_type;
+ typedef typename _Char_types<_CharT>::pos_type pos_type;
+ typedef typename _Char_types<_CharT>::off_type off_type;
+ typedef typename _Char_types<_CharT>::state_type state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
+ static std::size_t
+ length(const char_type* __s);
+ static const char_type*
+ find(const char_type* __s, std::size_t __n, const char_type& __a);
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ assign(char_type* __s, std::size_t __n, char_type __a);
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
+ };
+ template<typename _CharT>
+ int
+ char_traits<_CharT>::
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (lt(__s1[__i], __s2[__i]))
+ return -1;
+ else if (lt(__s2[__i], __s1[__i]))
+ return 1;
+ return 0;
+ }
+ template<typename _CharT>
+ std::size_t
+ char_traits<_CharT>::
+ length(const char_type* __p)
+ {
+ std::size_t __i = 0;
+ while (!eq(__p[__i], char_type()))
+ ++__i;
+ return __i;
+ }
+ template<typename _CharT>
+ const typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ find(const char_type* __s, std::size_t __n, const char_type& __a)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (eq(__s[__i], __a))
+ return __s + __i;
+ return 0;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ move(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ return static_cast<_CharT*>(__builtin_memmove(__s1, __s2,
+ __n * sizeof(char_type)));
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ std::copy(__s2, __s2 + __n, __s1);
+ return __s1;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ assign(char_type* __s, std::size_t __n, char_type __a)
+ {
+ std::fill_n(__s, __n, __a);
+ return __s;
+ }
+}
+namespace std {
+ template<class _CharT>
+ struct char_traits : public __gnu_cxx::char_traits<_CharT>
+ { };
+ template<>
+ struct char_traits<char>
+ {
+ typedef char char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return __builtin_memcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return __builtin_strlen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n)); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memmove(__s1, __s2, __n)); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memcpy(__s1, __s2, __n)); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return static_cast<char_type*>(__builtin_memset(__s, __a, __n)); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return (__c == eof()) ? 0 : __c; }
+ };
+ template<>
+ struct char_traits<wchar_t>
+ {
+ typedef wchar_t char_type;
+ typedef wint_t int_type;
+ typedef streamoff off_type;
+ typedef wstreampos pos_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return wcslen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return wmemchr(__s, __a, __n); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemmove(__s1, __s2, __n); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcpy(__s1, __s2, __n); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return wmemset(__s, __a, __n); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return int_type(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>(((wint_t)-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? 0 : __c; }
+ };
+}
+
+
+
+extern "C" {
+struct lconv
+{
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_n_cs_precedes;
+ char int_n_sep_by_space;
+ char int_n_sign_posn;
+ char int_p_cs_precedes;
+ char int_p_sep_by_space;
+ char int_p_sign_posn;
+};
+char *__attribute__((__cdecl__)) setlocale (int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) localeconv (void);
+struct _reent;
+char *__attribute__((__cdecl__)) _setlocale_r (struct _reent *, int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) _localeconv_r (struct _reent *);
+}
+namespace std {
+ using ::lconv;
+ using ::setlocale;
+ using ::localeconv;
+}
+
+namespace std {
+ typedef int* __c_locale;
+ inline int
+ __convert_from_v(const __c_locale&, char* __out,
+ const int __size __attribute__((__unused__)),
+ const char* __fmt, ...)
+ {
+ char* __old = std::setlocale(4, __null);
+ char* __sav = __null;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ std::setlocale(4, "C");
+ }
+ __builtin_va_list __args;
+ __builtin_va_start(__args, __fmt);
+ const int __ret = __builtin_vsprintf(__out, __fmt, __args);
+ __builtin_va_end(__args);
+ if (__sav)
+ {
+ std::setlocale(4, __sav);
+ delete [] __sav;
+ }
+ return __ret;
+ }
+}
+
+extern "C" {
+int __attribute__((__cdecl__)) isalnum (int __c);
+int __attribute__((__cdecl__)) isalpha (int __c);
+int __attribute__((__cdecl__)) iscntrl (int __c);
+int __attribute__((__cdecl__)) isdigit (int __c);
+int __attribute__((__cdecl__)) isgraph (int __c);
+int __attribute__((__cdecl__)) islower (int __c);
+int __attribute__((__cdecl__)) isprint (int __c);
+int __attribute__((__cdecl__)) ispunct (int __c);
+int __attribute__((__cdecl__)) isspace (int __c);
+int __attribute__((__cdecl__)) isupper (int __c);
+int __attribute__((__cdecl__)) isxdigit (int __c);
+int __attribute__((__cdecl__)) tolower (int __c);
+int __attribute__((__cdecl__)) toupper (int __c);
+int __attribute__((__cdecl__)) isblank (int __c);
+int __attribute__((__cdecl__)) isascii (int __c);
+int __attribute__((__cdecl__)) toascii (int __c);
+extern __attribute__((dllimport)) char *__ctype_ptr__;
+extern __attribute__((dllimport)) const char _ctype_[];
+}
+namespace std {
+ using ::isalnum;
+ using ::isalpha;
+ using ::iscntrl;
+ using ::isdigit;
+ using ::isgraph;
+ using ::islower;
+ using ::isprint;
+ using ::ispunct;
+ using ::isspace;
+ using ::isupper;
+ using ::isxdigit;
+ using ::tolower;
+ using ::toupper;
+}
+namespace std {
+ class locale;
+ template<typename _Facet>
+ bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale&);
+ template<typename _CharT>
+ bool
+ isspace(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isprint(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ iscntrl(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isupper(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ islower(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalpha(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ ispunct(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isxdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalnum(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isgraph(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ toupper(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ tolower(_CharT, const locale&);
+ class ctype_base;
+ template<typename _CharT>
+ class ctype;
+ template<> class ctype<char>;
+ template<> class ctype<wchar_t>;
+ template<typename _CharT>
+ class ctype_byname;
+ class codecvt_base;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt;
+ template<> class codecvt<char, char, mbstate_t>;
+ template<> class codecvt<wchar_t, char, mbstate_t>;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt_byname;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class num_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class num_put;
+
+ template<typename _CharT> class numpunct;
+ template<typename _CharT> class numpunct_byname;
+ template<typename _CharT>
+ class collate;
+ template<typename _CharT> class
+ collate_byname;
+ class time_base;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get_byname;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put_byname;
+ class money_base;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class money_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class money_put;
+
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct;
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct_byname;
+ class messages_base;
+ template<typename _CharT>
+ class messages;
+ template<typename _CharT>
+ class messages_byname;
+}
+
+#pragma GCC visibility push(default)
+extern "C" {
+typedef unsigned long sigset_t;
+extern "C" {
+struct _fpstate
+{
+ unsigned long cw;
+ unsigned long sw;
+ unsigned long tag;
+ unsigned long ipoff;
+ unsigned long cssel;
+ unsigned long dataoff;
+ unsigned long datasel;
+ unsigned char _st[80];
+ unsigned long nxst;
+};
+struct ucontext
+{
+ unsigned long cr2;
+ unsigned long dr0;
+ unsigned long dr1;
+ unsigned long dr2;
+ unsigned long dr3;
+ unsigned long dr6;
+ unsigned long dr7;
+ struct _fpstate fpstate;
+ unsigned long gs;
+ unsigned long fs;
+ unsigned long es;
+ unsigned long ds;
+ unsigned long edi;
+ unsigned long esi;
+ unsigned long ebx;
+ unsigned long edx;
+ unsigned long ecx;
+ unsigned long eax;
+ unsigned long ebp;
+ unsigned long eip;
+ unsigned long cs;
+ unsigned long eflags;
+ unsigned long esp;
+ unsigned long ss;
+ unsigned char _internal;
+ unsigned long oldmask;
+};
+typedef union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+} sigval_t;
+typedef struct sigevent
+{
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+ void (*sigev_notify_function) (sigval_t);
+ pthread_attr_t *sigev_notify_attributes;
+} sigevent_t;
+#pragma pack(push,4)
+struct _sigcommune
+{
+ __uint32_t _si_code;
+ void *_si_read_handle;
+ void *_si_write_handle;
+ void *_si_process_handle;
+ __extension__ union
+ {
+ int _si_fd;
+ void *_si_pipe_fhandler;
+ char *_si_str;
+ };
+};
+typedef struct
+{
+ int si_signo;
+ int si_code;
+ pid_t si_pid;
+ uid_t si_uid;
+ int si_errno;
+ __extension__ union
+ {
+ __uint32_t __pad[32];
+ struct _sigcommune _si_commune;
+ __extension__ union
+ {
+ struct
+ {
+ union
+ {
+ struct
+ {
+ timer_t si_tid;
+ unsigned int si_overrun;
+ };
+ sigval_t si_sigval;
+ sigval_t si_value;
+ };
+ };
+ };
+ __extension__ struct
+ {
+ int si_status;
+ clock_t si_utime;
+ clock_t si_stime;
+ };
+ void *si_addr;
+ };
+} siginfo_t;
+#pragma pack(pop)
+enum
+{
+ SI_USER = 0,
+ SI_ASYNCIO = 2,
+ SI_MESGQ,
+ SI_TIMER,
+ SI_QUEUE,
+ SI_KERNEL,
+ ILL_ILLOPC,
+ ILL_ILLOPN,
+ ILL_ILLADR,
+ ILL_ILLTRP,
+ ILL_PRVOPC,
+ ILL_PRVREG,
+ ILL_COPROC,
+ ILL_BADSTK,
+ FPE_INTDIV,
+ FPE_INTOVF,
+ FPE_FLTDIV,
+ FPE_FLTOVF,
+ FPE_FLTUND,
+ FPE_FLTRES,
+ FPE_FLTINV,
+ FPE_FLTSUB,
+ SEGV_MAPERR,
+ SEGV_ACCERR,
+ BUS_ADRALN,
+ BUS_ADRERR,
+ BUS_OBJERR,
+ CLD_EXITED,
+ CLD_KILLED,
+ CLD_DUMPED,
+ CLD_TRAPPED,
+ CLD_STOPPED,
+ CLD_CONTINUED
+};
+enum
+{
+ SIGEV_SIGNAL = 0,
+ SIGEV_NONE,
+ SIGEV_THREAD
+};
+typedef void (*_sig_func_ptr)(int);
+struct sigaction
+{
+ __extension__ union
+ {
+ _sig_func_ptr sa_handler;
+ void (*sa_sigaction) ( int, siginfo_t *, void * );
+ };
+ sigset_t sa_mask;
+ int sa_flags;
+};
+int sigwait (const sigset_t *, int *);
+int sigwaitinfo (const sigset_t *, siginfo_t *);
+int sighold (int);
+int sigignore (int);
+int sigrelse (int);
+_sig_func_ptr sigset (int, _sig_func_ptr);
+int sigqueue(pid_t, int, const union sigval);
+int siginterrupt (int, int);
+extern const char __attribute__((dllimport)) *sys_sigabbrev[];
+}
+int __attribute__((__cdecl__)) sigprocmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) pthread_sigmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) kill (pid_t, int);
+int __attribute__((__cdecl__)) killpg (pid_t, int);
+int __attribute__((__cdecl__)) sigaction (int, const struct sigaction *, struct sigaction *);
+int __attribute__((__cdecl__)) sigaddset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigdelset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigismember (const sigset_t *, int);
+int __attribute__((__cdecl__)) sigfillset (sigset_t *);
+int __attribute__((__cdecl__)) sigemptyset (sigset_t *);
+int __attribute__((__cdecl__)) sigpending (sigset_t *);
+int __attribute__((__cdecl__)) sigsuspend (const sigset_t *);
+int __attribute__((__cdecl__)) sigpause (int);
+int __attribute__((__cdecl__)) pthread_kill (pthread_t thread, int sig);
+int __attribute__((__cdecl__)) sigwaitinfo (const sigset_t *set, siginfo_t *info);
+int __attribute__((__cdecl__)) sigtimedwait (const sigset_t *set, siginfo_t *info, const struct timespec *timeout);
+int __attribute__((__cdecl__)) sigwait (const sigset_t *set, int *sig);
+int __attribute__((__cdecl__)) sigqueue (pid_t pid, int signo, const union sigval value);
+}
+extern "C" {
+typedef int sig_atomic_t;
+typedef _sig_func_ptr sig_t;
+typedef _sig_func_ptr sighandler_t;
+struct _reent;
+_sig_func_ptr __attribute__((__cdecl__)) _signal_r (struct _reent *, int, _sig_func_ptr);
+int __attribute__((__cdecl__)) _raise_r (struct _reent *, int);
+_sig_func_ptr __attribute__((__cdecl__)) signal (int, _sig_func_ptr);
+int __attribute__((__cdecl__)) raise (int);
+}
+extern "C" {
+struct sched_param {
+ int sched_priority;
+};
+}
+extern "C" {
+int sched_setparam(
+ pid_t __pid,
+ const struct sched_param *__param
+);
+int sched_getparam(
+ pid_t __pid,
+ struct sched_param *__param
+);
+int sched_setscheduler(
+ pid_t __pid,
+ int __policy,
+ const struct sched_param *__param
+);
+int sched_getscheduler(
+ pid_t __pid
+);
+int sched_get_priority_max(
+ int __policy
+);
+int sched_get_priority_min(
+ int __policy
+);
+int sched_rr_get_interval(
+ pid_t __pid,
+ struct timespec *__interval
+);
+int sched_yield( void );
+}
+extern "C"
+{
+int pthread_attr_destroy (pthread_attr_t *);
+int pthread_attr_getdetachstate (const pthread_attr_t *, int *);
+int pthread_attr_getinheritsched (const pthread_attr_t *, int *);
+int pthread_attr_getschedparam (const pthread_attr_t *, struct sched_param *);
+int pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
+int pthread_attr_getscope (const pthread_attr_t *, int *);
+int pthread_attr_init (pthread_attr_t *);
+int pthread_attr_setdetachstate (pthread_attr_t *, int);
+int pthread_attr_setinheritsched (pthread_attr_t *, int);
+int pthread_attr_setschedparam (pthread_attr_t *, const struct sched_param *);
+int pthread_attr_setschedpolicy (pthread_attr_t *, int);
+int pthread_attr_setscope (pthread_attr_t *, int);
+int pthread_attr_getstacksize (const pthread_attr_t *, size_t *);
+int pthread_attr_setstacksize (pthread_attr_t *, size_t);
+int pthread_cancel (pthread_t);
+typedef void (*__cleanup_routine_type) (void *);
+typedef struct _pthread_cleanup_handler
+{
+ __cleanup_routine_type function;
+ void *arg;
+ struct _pthread_cleanup_handler *next;
+} __pthread_cleanup_handler;
+void _pthread_cleanup_push (__pthread_cleanup_handler *handler);
+void _pthread_cleanup_pop (int execute);
+int pthread_cond_broadcast (pthread_cond_t *);
+int pthread_cond_destroy (pthread_cond_t *);
+int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *);
+int pthread_cond_signal (pthread_cond_t *);
+int pthread_cond_timedwait (pthread_cond_t *,
+ pthread_mutex_t *, const struct timespec *);
+int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
+int pthread_condattr_destroy (pthread_condattr_t *);
+int pthread_condattr_getpshared (const pthread_condattr_t *, int *);
+int pthread_condattr_init (pthread_condattr_t *);
+int pthread_condattr_setpshared (pthread_condattr_t *, int);
+int pthread_create (pthread_t *, const pthread_attr_t *,
+ void *(*)(void *), void *);
+int pthread_detach (pthread_t);
+int pthread_equal (pthread_t, pthread_t);
+void pthread_exit (void *);
+int pthread_getschedparam (pthread_t, int *, struct sched_param *);
+void *pthread_getspecific (pthread_key_t);
+int pthread_join (pthread_t, void **);
+int pthread_key_create (pthread_key_t *, void (*)(void *));
+int pthread_key_delete (pthread_key_t);
+int pthread_mutex_destroy (pthread_mutex_t *);
+int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *);
+int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+int pthread_mutex_lock (pthread_mutex_t *);
+int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *);
+int pthread_mutex_trylock (pthread_mutex_t *);
+int pthread_mutex_unlock (pthread_mutex_t *);
+int pthread_mutexattr_destroy (pthread_mutexattr_t *);
+int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getpshared (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_gettype (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_init (pthread_mutexattr_t *);
+int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setprotocol (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setpshared (pthread_mutexattr_t *, int);
+int pthread_mutexattr_settype (pthread_mutexattr_t *, int);
+int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);
+int pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
+int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
+int pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr);
+int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr,
+ int *pshared);
+int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);
+int pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr);
+int pthread_once (pthread_once_t *, void (*)(void));
+int pthread_getconcurrency (void);
+int pthread_setconcurrency (int);
+pthread_t pthread_self (void);
+int pthread_setcancelstate (int, int *);
+int pthread_setcanceltype (int, int *);
+int pthread_setschedparam (pthread_t, int, const struct sched_param *);
+int pthread_setspecific (pthread_key_t, const void *);
+void pthread_testcancel (void);
+int pthread_suspend (pthread_t);
+int pthread_continue (pthread_t);
+int pthread_yield (void);
+}
+typedef pthread_t __gthread_t;
+typedef pthread_key_t __gthread_key_t;
+typedef pthread_once_t __gthread_once_t;
+typedef pthread_mutex_t __gthread_mutex_t;
+typedef pthread_mutex_t __gthread_recursive_mutex_t;
+typedef pthread_cond_t __gthread_cond_t;
+typedef struct timespec __gthread_time_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static inline int
+__gthread_active_p (void)
+{
+ return 1;
+}
+static inline int
+__gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
+ void *__args)
+{
+ return pthread_create (__threadid, __null, __func, __args);
+}
+static inline int
+__gthread_join (__gthread_t __threadid, void **__value_ptr)
+{
+ return pthread_join (__threadid, __value_ptr);
+}
+static inline int
+__gthread_detach (__gthread_t __threadid)
+{
+ return pthread_detach (__threadid);
+}
+static inline int
+__gthread_equal (__gthread_t __t1, __gthread_t __t2)
+{
+ return pthread_equal (__t1, __t2);
+}
+static inline __gthread_t
+__gthread_self (void)
+{
+ return pthread_self ();
+}
+static inline int
+__gthread_yield (void)
+{
+ return sched_yield ();
+}
+static inline int
+__gthread_once (__gthread_once_t *__once, void (*__func) (void))
+{
+ if (__gthread_active_p ())
+ return pthread_once (__once, __func);
+ else
+ return -1;
+}
+static inline int
+__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
+{
+ return pthread_key_create (__key, __dtor);
+}
+static inline int
+__gthread_key_delete (__gthread_key_t __key)
+{
+ return pthread_key_delete (__key);
+}
+static inline void *
+__gthread_getspecific (__gthread_key_t __key)
+{
+ return pthread_getspecific (__key);
+}
+static inline int
+__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
+{
+ return pthread_setspecific (__key, __ptr);
+}
+static inline int
+__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_destroy (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_lock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_lock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_trylock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_unlock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_lock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_trylock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_unlock (__mutex);
+}
+static inline int
+__gthread_cond_broadcast (__gthread_cond_t *__cond)
+{
+ return pthread_cond_broadcast (__cond);
+}
+static inline int
+__gthread_cond_signal (__gthread_cond_t *__cond)
+{
+ return pthread_cond_signal (__cond);
+}
+static inline int
+__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
+{
+ return pthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return pthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return __gthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_destroy (__gthread_cond_t* __cond)
+{
+ return pthread_cond_destroy (__cond);
+}
+#pragma GCC visibility pop
+typedef int _Atomic_word;
+namespace __gnu_cxx {
+ static inline _Atomic_word
+ __exchange_and_add(volatile _Atomic_word* __mem, int __val)
+ { return __sync_fetch_and_add(__mem, __val); }
+ static inline void
+ __atomic_add(volatile _Atomic_word* __mem, int __val)
+ { __sync_fetch_and_add(__mem, __val); }
+ static inline _Atomic_word
+ __exchange_and_add_single(_Atomic_word* __mem, int __val)
+ {
+ _Atomic_word __result = *__mem;
+ *__mem += __val;
+ return __result;
+ }
+ static inline void
+ __atomic_add_single(_Atomic_word* __mem, int __val)
+ { *__mem += __val; }
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ return __exchange_and_add(__mem, __val);
+ else
+ return __exchange_and_add_single(__mem, __val);
+ }
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ __atomic_add(__mem, __val);
+ else
+ __atomic_add_single(__mem, __val);
+ }
+}
+
+
+namespace __gnu_cxx {
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+ ~new_allocator() throw() { }
+ pointer
+ address(reference __x) const { return &__x; }
+ const_pointer
+ address(const_reference __x) const { return &__x; }
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__n > this->max_size())
+ std::__throw_bad_alloc();
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+ size_type
+ max_size() const throw()
+ { return size_t(-1) / sizeof(_Tp); }
+ void
+ construct(pointer __p, const _Tp& __val)
+ { ::new((void *)__p) _Tp(__val); }
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+ template<typename _Tp>
+ inline bool
+ operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return false; }
+}
+namespace std {
+ template<typename _Tp>
+ class allocator;
+ template<>
+ class allocator<void>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ };
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ allocator() throw() { }
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+ ~allocator() throw() { }
+ };
+ template<typename _T1, typename _T2>
+ inline bool
+ operator==(const allocator<_T1>&, const allocator<_T2>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator==(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return true; }
+ template<typename _T1, typename _T2>
+ inline bool
+ operator!=(const allocator<_T1>&, const allocator<_T2>&)
+ { return false; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return false; }
+ extern template class allocator<char>;
+ extern template class allocator<wchar_t>;
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_swap
+ { static void _S_do_it(_Alloc&, _Alloc&) { } };
+ template<typename _Alloc>
+ struct __alloc_swap<_Alloc, false>
+ {
+ static void
+ _S_do_it(_Alloc& __one, _Alloc& __two)
+ {
+ if (__one != __two)
+ swap(__one, __two);
+ }
+ };
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_neq
+ {
+ static bool
+ _S_do_it(const _Alloc&, const _Alloc&)
+ { return false; }
+ };
+ template<typename _Alloc>
+ struct __alloc_neq<_Alloc, false>
+ {
+ static bool
+ _S_do_it(const _Alloc& __one, const _Alloc& __two)
+ { return __one != __two; }
+ };
+}
+
+
+#pragma GCC visibility push(default)
+namespace __cxxabiv1
+{
+ class __forced_unwind
+ {
+ virtual ~__forced_unwind() throw();
+ virtual void __pure_dummy() = 0;
+ };
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_write(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const streamsize __put = __out.rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ __out.setstate(__ios_base::badbit);
+ }
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const _CharT __c = __out.fill();
+ for (; __n > 0; --__n)
+ {
+ const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
+ if (_Traits::eq_int_type(__put, _Traits::eof()))
+ {
+ __out.setstate(__ios_base::badbit);
+ break;
+ }
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ typename __ostream_type::sentry __cerb(__out);
+ if (__cerb)
+ {
+ try
+ {
+ const streamsize __w = __out.width();
+ if (__w > __n)
+ {
+ const bool __left = ((__out.flags()
+ & __ios_base::adjustfield)
+ == __ios_base::left);
+ if (!__left)
+ __ostream_fill(__out, __w - __n);
+ if (__out.good())
+ __ostream_write(__out, __s, __n);
+ if (__left && __out.good())
+ __ostream_fill(__out, __w - __n);
+ }
+ else
+ __ostream_write(__out, __s, __n);
+ __out.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(__ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
+ extern template wostream& __ostream_insert(wostream&, const wchar_t*,
+ streamsize);
+}
+namespace std {
+ template<typename _Arg, typename _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Tp>
+ struct plus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x + __y; }
+ };
+ template<typename _Tp>
+ struct minus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x - __y; }
+ };
+ template<typename _Tp>
+ struct multiplies : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x * __y; }
+ };
+ template<typename _Tp>
+ struct divides : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x / __y; }
+ };
+ template<typename _Tp>
+ struct modulus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x % __y; }
+ };
+ template<typename _Tp>
+ struct negate : public unary_function<_Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x) const
+ { return -__x; }
+ };
+ template<typename _Tp>
+ struct equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x == __y; }
+ };
+ template<typename _Tp>
+ struct not_equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x != __y; }
+ };
+ template<typename _Tp>
+ struct greater : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x > __y; }
+ };
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
+ template<typename _Tp>
+ struct greater_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x >= __y; }
+ };
+ template<typename _Tp>
+ struct less_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x <= __y; }
+ };
+ template<typename _Tp>
+ struct logical_and : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x && __y; }
+ };
+ template<typename _Tp>
+ struct logical_or : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x || __y; }
+ };
+ template<typename _Tp>
+ struct logical_not : public unary_function<_Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x) const
+ { return !__x; }
+ };
+ template<typename _Tp>
+ struct bit_and : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x & __y; }
+ };
+ template<typename _Tp>
+ struct bit_or : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x | __y; }
+ };
+ template<typename _Tp>
+ struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x ^ __y; }
+ };
+ template<typename _Predicate>
+ class unary_negate
+ : public unary_function<typename _Predicate::argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ unary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::argument_type& __x) const
+ { return !_M_pred(__x); }
+ };
+ template<typename _Predicate>
+ inline unary_negate<_Predicate>
+ not1(const _Predicate& __pred)
+ { return unary_negate<_Predicate>(__pred); }
+ template<typename _Predicate>
+ class binary_negate
+ : public binary_function<typename _Predicate::first_argument_type,
+ typename _Predicate::second_argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ binary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::first_argument_type& __x,
+ const typename _Predicate::second_argument_type& __y) const
+ { return !_M_pred(__x, __y); }
+ };
+ template<typename _Predicate>
+ inline binary_negate<_Predicate>
+ not2(const _Predicate& __pred)
+ { return binary_negate<_Predicate>(__pred); }
+ template<typename _Arg, typename _Result>
+ class pointer_to_unary_function : public unary_function<_Arg, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg);
+ public:
+ pointer_to_unary_function() { }
+ explicit
+ pointer_to_unary_function(_Result (*__x)(_Arg))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg __x) const
+ { return _M_ptr(__x); }
+ };
+ template<typename _Arg, typename _Result>
+ inline pointer_to_unary_function<_Arg, _Result>
+ ptr_fun(_Result (*__x)(_Arg))
+ { return pointer_to_unary_function<_Arg, _Result>(__x); }
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ class pointer_to_binary_function
+ : public binary_function<_Arg1, _Arg2, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg1, _Arg2);
+ public:
+ pointer_to_binary_function() { }
+ explicit
+ pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg1 __x, _Arg2 __y) const
+ { return _M_ptr(__x, __y); }
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
+ ptr_fun(_Result (*__x)(_Arg1, _Arg2))
+ { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
+ template<typename _Tp>
+ struct _Identity : public unary_function<_Tp,_Tp>
+ {
+ _Tp&
+ operator()(_Tp& __x) const
+ { return __x; }
+ const _Tp&
+ operator()(const _Tp& __x) const
+ { return __x; }
+ };
+ template<typename _Pair>
+ struct _Select1st : public unary_function<_Pair,
+ typename _Pair::first_type>
+ {
+ typename _Pair::first_type&
+ operator()(_Pair& __x) const
+ { return __x.first; }
+ const typename _Pair::first_type&
+ operator()(const _Pair& __x) const
+ { return __x.first; }
+ };
+ template<typename _Pair>
+ struct _Select2nd : public unary_function<_Pair,
+ typename _Pair::second_type>
+ {
+ typename _Pair::second_type&
+ operator()(_Pair& __x) const
+ { return __x.second; }
+ const typename _Pair::second_type&
+ operator()(const _Pair& __x) const
+ { return __x.second; }
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_t : public unary_function<_Tp*, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_ref_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)())
+ { return mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)())
+ { return mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+}
+namespace std {
+ template<typename _Operation>
+ class binder1st
+ : public unary_function<typename _Operation::second_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::first_argument_type value;
+ public:
+ binder1st(const _Operation& __x,
+ const typename _Operation::first_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ typename _Operation::result_type
+ operator()(typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder1st<_Operation>
+ bind1st(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::first_argument_type _Arg1_type;
+ return binder1st<_Operation>(__fn, _Arg1_type(__x));
+ }
+ template<typename _Operation>
+ class binder2nd
+ : public unary_function<typename _Operation::first_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::second_argument_type value;
+ public:
+ binder2nd(const _Operation& __x,
+ const typename _Operation::second_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ typename _Operation::result_type
+ operator()(typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder2nd<_Operation>
+ bind2nd(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::second_argument_type _Arg2_type;
+ return binder2nd<_Operation>(__fn, _Arg2_type(__x));
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string
+ {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+ public:
+ typedef _Traits traits_type;
+ typedef typename _Traits::char_type value_type;
+ typedef _Alloc allocator_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ typedef typename _CharT_alloc_type::difference_type difference_type;
+ typedef typename _CharT_alloc_type::reference reference;
+ typedef typename _CharT_alloc_type::const_reference const_reference;
+ typedef typename _CharT_alloc_type::pointer pointer;
+ typedef typename _CharT_alloc_type::const_pointer const_pointer;
+ typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
+ typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
+ const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ private:
+ struct _Rep_base
+ {
+ size_type _M_length;
+ size_type _M_capacity;
+ _Atomic_word _M_refcount;
+ };
+ struct _Rep : _Rep_base
+ {
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
+ static const size_type _S_max_size;
+ static const _CharT _S_terminal;
+ static size_type _S_empty_rep_storage[];
+ static _Rep&
+ _S_empty_rep()
+ {
+ void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
+ return *reinterpret_cast<_Rep*>(__p);
+ }
+ bool
+ _M_is_leaked() const
+ { return this->_M_refcount < 0; }
+ bool
+ _M_is_shared() const
+ { return this->_M_refcount > 0; }
+ void
+ _M_set_leaked()
+ { this->_M_refcount = -1; }
+ void
+ _M_set_sharable()
+ { this->_M_refcount = 0; }
+ void
+ _M_set_length_and_sharable(size_type __n)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ {
+ this->_M_set_sharable();
+ this->_M_length = __n;
+ traits_type::assign(this->_M_refdata()[__n], _S_terminal);
+ }
+ }
+ _CharT*
+ _M_refdata() throw()
+ { return reinterpret_cast<_CharT*>(this + 1); }
+ _CharT*
+ _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
+ {
+ return (!_M_is_leaked() && __alloc1 == __alloc2)
+ ? _M_refcopy() : _M_clone(__alloc1);
+ }
+ static _Rep*
+ _S_create(size_type, size_type, const _Alloc&);
+ void
+ _M_dispose(const _Alloc& __a)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
+ -1) <= 0)
+ _M_destroy(__a);
+ }
+ void
+ _M_destroy(const _Alloc&) throw();
+ _CharT*
+ _M_refcopy() throw()
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
+ return _M_refdata();
+ }
+ _CharT*
+ _M_clone(const _Alloc&, size_type __res = 0);
+ };
+ struct _Alloc_hider : _Alloc
+ {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a)
+ : _Alloc(__a), _M_p(__dat) { }
+ _CharT* _M_p;
+ };
+ public:
+ static const size_type npos = static_cast<size_type>(-1);
+ private:
+ mutable _Alloc_hider _M_dataplus;
+ _CharT*
+ _M_data() const
+ { return _M_dataplus._M_p; }
+ _CharT*
+ _M_data(_CharT* __p)
+ { return (_M_dataplus._M_p = __p); }
+ _Rep*
+ _M_rep() const
+ { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
+ iterator
+ _M_ibegin() const
+ { return iterator(_M_data()); }
+ iterator
+ _M_iend() const
+ { return iterator(_M_data() + this->size()); }
+ void
+ _M_leak()
+ {
+ if (!_M_rep()->_M_is_leaked())
+ _M_leak_hard();
+ }
+ size_type
+ _M_check(size_type __pos, const char* __s) const
+ {
+ if (__pos > this->size())
+ __throw_out_of_range((__s));
+ return __pos;
+ }
+ void
+ _M_check_length(size_type __n1, size_type __n2, const char* __s) const
+ {
+ if (this->max_size() - (this->size() - __n1) < __n2)
+ __throw_length_error((__s));
+ }
+ size_type
+ _M_limit(size_type __pos, size_type __off) const
+ {
+ const bool __testoff = __off < this->size() - __pos;
+ return __testoff ? __off : this->size() - __pos;
+ }
+ bool
+ _M_disjunct(const _CharT* __s) const
+ {
+ return (less<const _CharT*>()(__s, _M_data())
+ || less<const _CharT*>()(_M_data() + this->size(), __s));
+ }
+ static void
+ _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::copy(__d, __s, __n);
+ }
+ static void
+ _M_move(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::move(__d, __s, __n);
+ }
+ static void
+ _M_assign(_CharT* __d, size_type __n, _CharT __c)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, __c);
+ else
+ traits_type::assign(__d, __n, __c);
+ }
+ template<class _Iterator>
+ static void
+ _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
+ {
+ for (; __k1 != __k2; ++__k1, ++__p)
+ traits_type::assign(*__p, *__k1);
+ }
+ static void
+ _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static void
+ _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static int
+ _S_compare(size_type __n1, size_type __n2)
+ {
+ const difference_type __d = difference_type(__n1 - __n2);
+ if (__d > __gnu_cxx::__numeric_traits<int>::__max)
+ return __gnu_cxx::__numeric_traits<int>::__max;
+ else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
+ return __gnu_cxx::__numeric_traits<int>::__min;
+ else
+ return int(__d);
+ }
+ void
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2);
+ void
+ _M_leak_hard();
+ static _Rep&
+ _S_empty_rep()
+ { return _Rep::_S_empty_rep(); }
+ public:
+ basic_string()
+ : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
+ explicit
+ basic_string(const _Alloc& __a);
+ basic_string(const basic_string& __str);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n = npos);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a);
+ basic_string(const _CharT* __s, size_type __n,
+ const _Alloc& __a = _Alloc());
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
+ template<class _InputIterator>
+ basic_string(_InputIterator __beg, _InputIterator __end,
+ const _Alloc& __a = _Alloc());
+ ~basic_string()
+ { _M_rep()->_M_dispose(this->get_allocator()); }
+ basic_string&
+ operator=(const basic_string& __str)
+ { return this->assign(__str); }
+ basic_string&
+ operator=(const _CharT* __s)
+ { return this->assign(__s); }
+ basic_string&
+ operator=(_CharT __c)
+ {
+ this->assign(1, __c);
+ return *this;
+ }
+ iterator
+ begin()
+ {
+ _M_leak();
+ return iterator(_M_data());
+ }
+ const_iterator
+ begin() const
+ { return const_iterator(_M_data()); }
+ iterator
+ end()
+ {
+ _M_leak();
+ return iterator(_M_data() + this->size());
+ }
+ const_iterator
+ end() const
+ { return const_iterator(_M_data() + this->size()); }
+ reverse_iterator
+ rbegin()
+ { return reverse_iterator(this->end()); }
+ const_reverse_iterator
+ rbegin() const
+ { return const_reverse_iterator(this->end()); }
+ reverse_iterator
+ rend()
+ { return reverse_iterator(this->begin()); }
+ const_reverse_iterator
+ rend() const
+ { return const_reverse_iterator(this->begin()); }
+ public:
+ size_type
+ size() const
+ { return _M_rep()->_M_length; }
+ size_type
+ length() const
+ { return _M_rep()->_M_length; }
+ size_type
+ max_size() const
+ { return _Rep::_S_max_size; }
+ void
+ resize(size_type __n, _CharT __c);
+ void
+ resize(size_type __n)
+ { this->resize(__n, _CharT()); }
+ size_type
+ capacity() const
+ { return _M_rep()->_M_capacity; }
+ void
+ reserve(size_type __res_arg = 0);
+ void
+ clear()
+ { _M_mutate(0, this->size(), 0); }
+ bool
+ empty() const
+ { return this->size() == 0; }
+ const_reference
+ operator[] (size_type __pos) const
+ {
+ ;
+ return _M_data()[__pos];
+ }
+ reference
+ operator[](size_type __pos)
+ {
+ ;
+ ;
+ _M_leak();
+ return _M_data()[__pos];
+ }
+ const_reference
+ at(size_type __n) const
+ {
+ if (__n >= this->size())
+ __throw_out_of_range(("basic_string::at"));
+ return _M_data()[__n];
+ }
+ reference
+ at(size_type __n)
+ {
+ if (__n >= size())
+ __throw_out_of_range(("basic_string::at"));
+ _M_leak();
+ return _M_data()[__n];
+ }
+ basic_string&
+ operator+=(const basic_string& __str)
+ { return this->append(__str); }
+ basic_string&
+ operator+=(const _CharT* __s)
+ { return this->append(__s); }
+ basic_string&
+ operator+=(_CharT __c)
+ {
+ this->push_back(__c);
+ return *this;
+ }
+ basic_string&
+ append(const basic_string& __str);
+ basic_string&
+ append(const basic_string& __str, size_type __pos, size_type __n);
+ basic_string&
+ append(const _CharT* __s, size_type __n);
+ basic_string&
+ append(const _CharT* __s)
+ {
+ ;
+ return this->append(__s, traits_type::length(__s));
+ }
+ basic_string&
+ append(size_type __n, _CharT __c);
+ template<class _InputIterator>
+ basic_string&
+ append(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_iend(), _M_iend(), __first, __last); }
+ void
+ push_back(_CharT __c)
+ {
+ const size_type __len = 1 + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ traits_type::assign(_M_data()[this->size()], __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ basic_string&
+ assign(const basic_string& __str);
+ basic_string&
+ assign(const basic_string& __str, size_type __pos, size_type __n)
+ { return this->assign(__str._M_data()
+ + __str._M_check(__pos, "basic_string::assign"),
+ __str._M_limit(__pos, __n)); }
+ basic_string&
+ assign(const _CharT* __s, size_type __n);
+ basic_string&
+ assign(const _CharT* __s)
+ {
+ ;
+ return this->assign(__s, traits_type::length(__s));
+ }
+ basic_string&
+ assign(size_type __n, _CharT __c)
+ { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
+ template<class _InputIterator>
+ basic_string&
+ assign(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
+ void
+ insert(iterator __p, size_type __n, _CharT __c)
+ { this->replace(__p, __p, __n, __c); }
+ template<class _InputIterator>
+ void
+ insert(iterator __p, _InputIterator __beg, _InputIterator __end)
+ { this->replace(__p, __p, __beg, __end); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str)
+ { return this->insert(__pos1, __str, size_type(0), __str.size()); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str,
+ size_type __pos2, size_type __n)
+ { return this->insert(__pos1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::insert"),
+ __str._M_limit(__pos2, __n)); }
+ basic_string&
+ insert(size_type __pos, const _CharT* __s, size_type __n);
+ basic_string&
+ insert(size_type __pos, const _CharT* __s)
+ {
+ ;
+ return this->insert(__pos, __s, traits_type::length(__s));
+ }
+ basic_string&
+ insert(size_type __pos, size_type __n, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
+ size_type(0), __n, __c); }
+ iterator
+ insert(iterator __p, _CharT __c)
+ {
+ ;
+ const size_type __pos = __p - _M_ibegin();
+ _M_replace_aux(__pos, size_type(0), size_type(1), __c);
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ basic_string&
+ erase(size_type __pos = 0, size_type __n = npos)
+ {
+ _M_mutate(_M_check(__pos, "basic_string::erase"),
+ _M_limit(__pos, __n), size_type(0));
+ return *this;
+ }
+ iterator
+ erase(iterator __position)
+ {
+ ;
+ const size_type __pos = __position - _M_ibegin();
+ _M_mutate(__pos, size_type(1), size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ iterator
+ erase(iterator __first, iterator __last);
+ basic_string&
+ replace(size_type __pos, size_type __n, const basic_string& __str)
+ { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2)
+ { return this->replace(__pos1, __n1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::replace"),
+ __str._M_limit(__pos2, __n2)); }
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s)
+ {
+ ;
+ return this->replace(__pos, __n1, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
+ _M_limit(__pos, __n1), __n2, __c); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const basic_string& __str)
+ { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
+ {
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s)
+ {
+ ;
+ return this->replace(__i1, __i2, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
+ {
+ ;
+ return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
+ }
+ template<class _InputIterator>
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ _InputIterator __k1, _InputIterator __k2)
+ {
+ ;
+ ;
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const _CharT* __k1, const _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const_iterator __k1, const_iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ private:
+ template<class _Integer>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
+ _Integer __val, __true_type)
+ { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
+ template<class _InputIterator>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type);
+ basic_string&
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c);
+ basic_string&
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ template<class _InIterator>
+ static _CharT*
+ _S_construct_aux(_InIterator __beg, _InIterator __end,
+ const _Alloc& __a, __false_type)
+ {
+ typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
+ return _S_construct(__beg, __end, __a, _Tag());
+ }
+ template<class _Integer>
+ static _CharT*
+ _S_construct_aux(_Integer __beg, _Integer __end,
+ const _Alloc& __a, __true_type)
+ { return _S_construct_aux_2(static_cast<size_type>(__beg),
+ __end, __a); }
+ static _CharT*
+ _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
+ { return _S_construct(__req, __c, __a); }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
+ {
+ typedef typename std::__is_integer<_InIterator>::__type _Integral;
+ return _S_construct_aux(__beg, __end, __a, _Integral());
+ }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag);
+ template<class _FwdIterator>
+ static _CharT*
+ _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
+ forward_iterator_tag);
+ static _CharT*
+ _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
+ public:
+ size_type
+ copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
+ void
+ swap(basic_string& __s);
+ const _CharT*
+ c_str() const
+ { return _M_data(); }
+ const _CharT*
+ data() const
+ { return _M_data(); }
+ allocator_type
+ get_allocator() const
+ { return _M_dataplus; }
+ size_type
+ find(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find(const basic_string& __str, size_type __pos = 0) const
+ { return this->find(__str.data(), __pos, __str.size()); }
+ size_type
+ find(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find(_CharT __c, size_type __pos = 0) const;
+ size_type
+ rfind(const basic_string& __str, size_type __pos = npos) const
+ { return this->rfind(__str.data(), __pos, __str.size()); }
+ size_type
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ rfind(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->rfind(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ rfind(_CharT __c, size_type __pos = npos) const;
+ size_type
+ find_first_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_of(_CharT __c, size_type __pos = 0) const
+ { return this->find(__c, __pos); }
+ size_type
+ find_last_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_of(_CharT __c, size_type __pos = npos) const
+ { return this->rfind(__c, __pos); }
+ size_type
+ find_first_not_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_not_of(_CharT __c, size_type __pos = 0) const;
+ size_type
+ find_last_not_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_not_of(_CharT __c, size_type __pos = npos) const;
+ basic_string
+ substr(size_type __pos = 0, size_type __n = npos) const
+ { return basic_string(*this,
+ _M_check(__pos, "basic_string::substr"), __n); }
+ int
+ compare(const basic_string& __str) const
+ {
+ const size_type __size = this->size();
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ int
+ compare(size_type __pos, size_type __n, const basic_string& __str) const;
+ int
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const;
+ int
+ compare(const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const;
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str(__lhs);
+ __str.append(__size_type(1), __rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT>
+ inline
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
+ operator==(const basic_string<_CharT>& __lhs,
+ const basic_string<_CharT>& __rhs)
+ { return (__lhs.size() == __rhs.size()
+ && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
+ __lhs.size())); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline void
+ swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { __lhs.swap(__rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __is, basic_string<char>& __str);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ return __ostream_insert(__os, __str.data(), __str.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ { return getline(__is, __str, __is.widen('\n')); }
+ template<>
+ basic_istream<char>&
+ getline(basic_istream<char>& __in, basic_string<char>& __str,
+ char __delim);
+ template<>
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
+ wchar_t __delim);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const _CharT
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_terminal = _CharT();
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::npos;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
+ (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
+ sizeof(size_type)];
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _CharT __buf[128];
+ size_type __len = 0;
+ while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))
+ {
+ __buf[__len++] = *__beg;
+ ++__beg;
+ }
+ _Rep* __r = _Rep::_S_create(__len, size_type(0), __a);
+ _M_copy(__r->_M_refdata(), __buf, __len);
+ try
+ {
+ while (__beg != __end)
+ {
+ if (__len == __r->_M_capacity)
+ {
+ _Rep* __another = _Rep::_S_create(__len + 1, __len, __a);
+ _M_copy(__another->_M_refdata(), __r->_M_refdata(), __len);
+ __r->_M_destroy(__a);
+ __r = __another;
+ }
+ __r->_M_refdata()[__len++] = *__beg;
+ ++__beg;
+ }
+ }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__len);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template <typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ forward_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
+ __throw_logic_error(("basic_string::_S_construct NULL not valid"));
+ const size_type __dnew = static_cast<size_type>(std::distance(__beg,
+ __end));
+ _Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);
+ try
+ { _S_copy_chars(__r->_M_refdata(), __beg, __end); }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__dnew);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(size_type __n, _CharT __c, const _Alloc& __a)
+ {
+ if (__n == 0 && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
+ if (__n)
+ _M_assign(__r->_M_refdata(), __n, __c);
+ __r->_M_set_length_and_sharable(__n);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str)
+ : _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()),
+ __str.get_allocator()),
+ __str.get_allocator())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _Alloc& __a)
+ : _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos, size_type __n)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, _Alloc()), _Alloc())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
+ __s + npos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__n, __c, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__beg, __end, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const basic_string& __str)
+ {
+ if (_M_rep() != __str._M_rep())
+ {
+ const allocator_type __a = this->get_allocator();
+ _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check_length(this->size(), __n, "basic_string::assign");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(size_type(0), this->size(), __s, __n);
+ else
+ {
+ const size_type __pos = __s - _M_data();
+ if (__pos >= __n)
+ _M_copy(_M_data(), __s, __n);
+ else if (__pos)
+ _M_move(_M_data(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__n);
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(size_type __n, _CharT __c)
+ {
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_assign(_M_data() + this->size(), __n, __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const _CharT* __s, size_type __n)
+ {
+ ;
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (_M_disjunct(__s))
+ this->reserve(__len);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ this->reserve(__len);
+ __s = _M_data() + __off;
+ }
+ }
+ _M_copy(_M_data() + this->size(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str)
+ {
+ const size_type __size = __str.size();
+ if (__size)
+ {
+ const size_type __len = __size + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data(), __size);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str, size_type __pos, size_type __n)
+ {
+ __str._M_check(__pos, "basic_string::append");
+ __n = __str._M_limit(__pos, __n);
+ if (__n)
+ {
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data() + __pos, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ insert(size_type __pos, const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check(__pos, "basic_string::insert");
+ _M_check_length(size_type(0), __n, "basic_string::insert");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, size_type(0), __s, __n);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ _M_mutate(__pos, 0, __n);
+ __s = _M_data() + __off;
+ _CharT* __p = _M_data() + __pos;
+ if (__s + __n <= __p)
+ _M_copy(__p, __s, __n);
+ else if (__s >= __p)
+ _M_copy(__p, __s + __n, __n);
+ else
+ {
+ const size_type __nleft = __p - __s;
+ _M_copy(__p, __s, __nleft);
+ _M_copy(__p + __nleft, __p + __n, __n - __nleft);
+ }
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::iterator
+ basic_string<_CharT, _Traits, _Alloc>::
+ erase(iterator __first, iterator __last)
+ {
+ ;
+ const size_type __size = __last - __first;
+ if (__size)
+ {
+ const size_type __pos = __first - _M_ibegin();
+ _M_mutate(__pos, __size, size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ else
+ return __first;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ ;
+ _M_check(__pos, "basic_string::replace");
+ __n1 = _M_limit(__pos, __n1);
+ _M_check_length(__n1, __n2, "basic_string::replace");
+ bool __left;
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, __n1, __s, __n2);
+ else if ((__left = __s + __n2 <= _M_data() + __pos)
+ || _M_data() + __pos + __n1 <= __s)
+ {
+ size_type __off = __s - _M_data();
+ __left ? __off : (__off += __n2 - __n1);
+ _M_mutate(__pos, __n1, __n2);
+ _M_copy(_M_data() + __pos, _M_data() + __off, __n2);
+ return *this;
+ }
+ else
+ {
+ const basic_string __tmp(__s, __n2);
+ return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_destroy(const _Alloc& __a) throw ()
+ {
+ const size_type __size = sizeof(_Rep_base) +
+ (this->_M_capacity + 1) * sizeof(_CharT);
+ _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_leak_hard()
+ {
+ if (_M_rep() == &_S_empty_rep())
+ return;
+ if (_M_rep()->_M_is_shared())
+ _M_mutate(0, 0, 0);
+ _M_rep()->_M_set_leaked();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2)
+ {
+ const size_type __old_size = this->size();
+ const size_type __new_size = __old_size + __len2 - __len1;
+ const size_type __how_much = __old_size - __pos - __len1;
+ if (__new_size > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ const allocator_type __a = get_allocator();
+ _Rep* __r = _Rep::_S_create(__new_size, this->capacity(), __a);
+ if (__pos)
+ _M_copy(__r->_M_refdata(), _M_data(), __pos);
+ if (__how_much)
+ _M_copy(__r->_M_refdata() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ _M_rep()->_M_dispose(__a);
+ _M_data(__r->_M_refdata());
+ }
+ else if (__how_much && __len1 != __len2)
+ {
+ _M_move(_M_data() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ }
+ _M_rep()->_M_set_length_and_sharable(__new_size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ reserve(size_type __res)
+ {
+ if (__res != this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (__res < this->size())
+ __res = this->size();
+ const allocator_type __a = get_allocator();
+ _CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ swap(basic_string& __s)
+ {
+ if (_M_rep()->_M_is_leaked())
+ _M_rep()->_M_set_sharable();
+ if (__s._M_rep()->_M_is_leaked())
+ __s._M_rep()->_M_set_sharable();
+ if (this->get_allocator() == __s.get_allocator())
+ {
+ _CharT* __tmp = _M_data();
+ _M_data(__s._M_data());
+ __s._M_data(__tmp);
+ }
+ else
+ {
+ const basic_string __tmp1(_M_ibegin(), _M_iend(),
+ __s.get_allocator());
+ const basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
+ this->get_allocator());
+ *this = __tmp2;
+ __s = __tmp1;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _S_create(size_type __capacity, size_type __old_capacity,
+ const _Alloc& __alloc)
+ {
+ if (__capacity > _S_max_size)
+ __throw_length_error(("basic_string::_S_create"));
+ const size_type __pagesize = 4096;
+ const size_type __malloc_header_size = 4 * sizeof(void*);
+ if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
+ __capacity = 2 * __old_capacity;
+ size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ const size_type __adj_size = __size + __malloc_header_size;
+ if (__adj_size > __pagesize && __capacity > __old_capacity)
+ {
+ const size_type __extra = __pagesize - __adj_size % __pagesize;
+ __capacity += __extra / sizeof(_CharT);
+ if (__capacity > _S_max_size)
+ __capacity = _S_max_size;
+ __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ }
+ void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
+ _Rep *__p = new (__place) _Rep;
+ __p->_M_capacity = __capacity;
+ __p->_M_set_sharable();
+ return __p;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_clone(const _Alloc& __alloc, size_type __res)
+ {
+ const size_type __requested_cap = this->_M_length + __res;
+ _Rep* __r = _Rep::_S_create(__requested_cap, this->_M_capacity,
+ __alloc);
+ if (this->_M_length)
+ _M_copy(__r->_M_refdata(), _M_refdata(), this->_M_length);
+ __r->_M_set_length_and_sharable(this->_M_length);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ resize(size_type __n, _CharT __c)
+ {
+ const size_type __size = this->size();
+ _M_check_length(__size, __n, "basic_string::resize");
+ if (__size < __n)
+ this->append(__n - __size, __c);
+ else if (__n < __size)
+ this->erase(__n);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type)
+ {
+ const basic_string __s(__k1, __k2);
+ const size_type __n1 = __i2 - __i1;
+ _M_check_length(__n1, __s.size(), "basic_string::_M_replace_dispatch");
+ return _M_replace_safe(__i1 - _M_ibegin(), __n1, __s._M_data(),
+ __s.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c)
+ {
+ _M_check_length(__n1, __n2, "basic_string::_M_replace_aux");
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_assign(_M_data() + __pos1, __n2, __c);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_copy(_M_data() + __pos1, __s, __n2);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ ;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ const __size_type __len = _Traits::length(__lhs);
+ __string_type __str;
+ __str.reserve(__len + __rhs.size());
+ __str.append(__lhs, __len);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str;
+ const __size_type __len = __rhs.size();
+ __str.reserve(__len + 1);
+ __str.append(__size_type(1), __lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ copy(_CharT* __s, size_type __n, size_type __pos) const
+ {
+ _M_check(__pos, "basic_string::copy");
+ __n = _M_limit(__pos, __n);
+ ;
+ if (__n)
+ _M_copy(__s, _M_data() + __pos, __n);
+ return __n;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ const _CharT* __data = _M_data();
+ if (__n == 0)
+ return __pos <= __size ? __pos : npos;
+ if (__n <= __size)
+ {
+ for (; __pos <= __size - __n; ++__pos)
+ if (traits_type::eq(__data[__pos], __s[0])
+ && traits_type::compare(__data + __pos + 1,
+ __s + 1, __n - 1) == 0)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(_CharT __c, size_type __pos) const
+ {
+ size_type __ret = npos;
+ const size_type __size = this->size();
+ if (__pos < __size)
+ {
+ const _CharT* __data = _M_data();
+ const size_type __n = __size - __pos;
+ const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
+ if (__p)
+ __ret = __p - __data;
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ if (__n <= __size)
+ {
+ __pos = std::min(size_type(__size - __n), __pos);
+ const _CharT* __data = _M_data();
+ do
+ {
+ if (traits_type::compare(__data + __pos, __s, __n) == 0)
+ return __pos;
+ }
+ while (__pos-- > 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ for (++__size; __size-- > 0; )
+ if (traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __n && __pos < this->size(); ++__pos)
+ {
+ const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
+ if (__p)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size && __n)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size-- != 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::find(__s, __n, _M_data()[__pos]))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(_CharT __c, size_type __pos) const
+ {
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::eq(_M_data()[__pos], __c))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n, const basic_string& __str) const
+ {
+ _M_check(__pos, "basic_string::compare");
+ __n = _M_limit(__pos, __n);
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__n, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__n, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const
+ {
+ _M_check(__pos1, "basic_string::compare");
+ __str._M_check(__pos2, "basic_string::compare");
+ __n1 = _M_limit(__pos1, __n1);
+ __n2 = __str._M_limit(__pos2, __n2);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos1,
+ __str.data() + __pos2, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(const _CharT* __s) const
+ {
+ ;
+ const size_type __size = this->size();
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __s, __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__n1, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef typename __ctype_type::ctype_base __ctype_base;
+ __size_type __extracted = 0;
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ _CharT __buf[128];
+ __size_type __len = 0;
+ const streamsize __w = __in.width();
+ const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
+ : __str.max_size();
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(__ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ if (__len == sizeof(__buf) / sizeof(_CharT))
+ {
+ __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
+ __len = 0;
+ }
+ __buf[__len++] = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ __str.append(__buf, __len);
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ __size_type __extracted = 0;
+ const __size_type __n = __str.max_size();
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, true);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ const __int_type __idelim = _Traits::to_int_type(__delim);
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !_Traits::eq_int_type(__c, __idelim))
+ {
+ __str += _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ else if (_Traits::eq_int_type(__c, __idelim))
+ {
+ ++__extracted;
+ __in.rdbuf()->sbumpc();
+ }
+ else
+ __err |= __ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ extern template class basic_string<char>;
+ extern template
+ basic_istream<char>&
+ operator>>(basic_istream<char>&, string&);
+ extern template
+ basic_ostream<char>&
+ operator<<(basic_ostream<char>&, const string&);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&, char);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&);
+ extern template class basic_string<wchar_t>;
+ extern template
+ basic_istream<wchar_t>&
+ operator>>(basic_istream<wchar_t>&, wstring&);
+ extern template
+ basic_ostream<wchar_t>&
+ operator<<(basic_ostream<wchar_t>&, const wstring&);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&, wchar_t);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&);
+}
+namespace std {
+ class locale
+ {
+ public:
+ typedef int category;
+ class facet;
+ class id;
+ class _Impl;
+ friend class facet;
+ friend class _Impl;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ static const category none = 0;
+ static const category ctype = 1L << 0;
+ static const category numeric = 1L << 1;
+ static const category collate = 1L << 2;
+ static const category time = 1L << 3;
+ static const category monetary = 1L << 4;
+ static const category messages = 1L << 5;
+ static const category all = (ctype | numeric | collate |
+ time | monetary | messages);
+ locale() throw();
+ locale(const locale& __other) throw();
+ explicit
+ locale(const char* __s);
+ locale(const locale& __base, const char* __s, category __cat);
+ locale(const locale& __base, const locale& __add, category __cat);
+ template<typename _Facet>
+ locale(const locale& __other, _Facet* __f);
+ ~locale() throw();
+ const locale&
+ operator=(const locale& __other) throw();
+ template<typename _Facet>
+ locale
+ combine(const locale& __other) const;
+ string
+ name() const;
+ bool
+ operator==(const locale& __other) const throw();
+ bool
+ operator!=(const locale& __other) const throw()
+ { return !(this->operator==(__other)); }
+ template<typename _Char, typename _Traits, typename _Alloc>
+ bool
+ operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
+ const basic_string<_Char, _Traits, _Alloc>& __s2) const;
+ static locale
+ global(const locale&);
+ static const locale&
+ classic();
+ private:
+ _Impl* _M_impl;
+ static _Impl* _S_classic;
+ static _Impl* _S_global;
+ static const char* const* const _S_categories;
+ enum { _S_categories_size = 6 + 0 };
+ static __gthread_once_t _S_once;
+ explicit
+ locale(_Impl*) throw();
+ static void
+ _S_initialize();
+ static void
+ _S_initialize_once() throw();
+ static category
+ _S_normalize_category(category);
+ void
+ _M_coalesce(const locale& __base, const locale& __add, category __cat);
+ };
+ class locale::facet
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ mutable _Atomic_word _M_refcount;
+ static __c_locale _S_c_locale;
+ static const char _S_c_name[2];
+ static __gthread_once_t _S_once;
+ static void
+ _S_initialize_once();
+ protected:
+ explicit
+ facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
+ { }
+ virtual
+ ~facet();
+ static void
+ _S_create_c_locale(__c_locale& __cloc, const char* __s,
+ __c_locale __old = 0);
+ static __c_locale
+ _S_clone_c_locale(__c_locale& __cloc) throw();
+ static void
+ _S_destroy_c_locale(__c_locale& __cloc);
+ static __c_locale
+ _S_lc_ctype_c_locale(__c_locale __cloc, const char* __s);
+ static __c_locale
+ _S_get_c_locale();
+ __attribute__ ((__const__)) static const char*
+ _S_get_c_name() throw();
+ private:
+ void
+ _M_add_reference() const throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() const throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ facet(const facet&);
+ facet&
+ operator=(const facet&);
+ };
+ class locale::id
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ mutable size_t _M_index;
+ static _Atomic_word _S_refcount;
+ void
+ operator=(const id&);
+ id(const id&);
+ public:
+ id() { }
+ size_t
+ _M_id() const throw();
+ };
+ class locale::_Impl
+ {
+ public:
+ friend class locale;
+ friend class locale::facet;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ private:
+ _Atomic_word _M_refcount;
+ const facet** _M_facets;
+ size_t _M_facets_size;
+ const facet** _M_caches;
+ char** _M_names;
+ static const locale::id* const _S_id_ctype[];
+ static const locale::id* const _S_id_numeric[];
+ static const locale::id* const _S_id_collate[];
+ static const locale::id* const _S_id_time[];
+ static const locale::id* const _S_id_monetary[];
+ static const locale::id* const _S_id_messages[];
+ static const locale::id* const* const _S_facet_categories[];
+ void
+ _M_add_reference() throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ _Impl(const _Impl&, size_t);
+ _Impl(const char*, size_t);
+ _Impl(size_t) throw();
+ ~_Impl() throw();
+ _Impl(const _Impl&);
+ void
+ operator=(const _Impl&);
+ bool
+ _M_check_same_name()
+ {
+ bool __ret = true;
+ if (_M_names[1])
+ for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
+ __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
+ return __ret;
+ }
+ void
+ _M_replace_categories(const _Impl*, category);
+ void
+ _M_replace_category(const _Impl*, const locale::id* const*);
+ void
+ _M_replace_facet(const _Impl*, const locale::id*);
+ void
+ _M_install_facet(const locale::id*, const facet*);
+ template<typename _Facet>
+ void
+ _M_init_facet(_Facet* __facet)
+ { _M_install_facet(&_Facet::id, __facet); }
+ void
+ _M_install_cache(const facet*, size_t);
+ };
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc);
+ template<typename _CharT>
+ class collate : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ protected:
+ __c_locale _M_c_locale_collate;
+ public:
+ static locale::id id;
+ explicit
+ collate(size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
+ { }
+ explicit
+ collate(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
+ { }
+ int
+ compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
+ string_type
+ transform(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_transform(__lo, __hi); }
+ long
+ hash(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_hash(__lo, __hi); }
+ int
+ _M_compare(const _CharT*, const _CharT*) const throw();
+ size_t
+ _M_transform(_CharT*, const _CharT*, size_t) const throw();
+ protected:
+ virtual
+ ~collate()
+ { _S_destroy_c_locale(_M_c_locale_collate); }
+ virtual int
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const;
+ virtual string_type
+ do_transform(const _CharT* __lo, const _CharT* __hi) const;
+ virtual long
+ do_hash(const _CharT* __lo, const _CharT* __hi) const;
+ };
+ template<typename _CharT>
+ locale::id collate<_CharT>::id;
+ template<>
+ int
+ collate<char>::_M_compare(const char*, const char*) const throw();
+ template<>
+ size_t
+ collate<char>::_M_transform(char*, const char*, size_t) const throw();
+ template<>
+ int
+ collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const throw();
+ template<>
+ size_t
+ collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const throw();
+ template<typename _CharT>
+ class collate_byname : public collate<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ collate_byname(const char* __s, size_t __refs = 0)
+ : collate<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ this->_S_destroy_c_locale(this->_M_c_locale_collate);
+ this->_S_create_c_locale(this->_M_c_locale_collate, __s);
+ }
+ }
+ protected:
+ virtual
+ ~collate_byname() { }
+ };
+}
+
+namespace std {
+ template<typename _Facet>
+ locale::
+ locale(const locale& __other, _Facet* __f)
+ {
+ _M_impl = new _Impl(*__other._M_impl, 1);
+ try
+ { _M_impl->_M_install_facet(&_Facet::id, __f); }
+ catch(...)
+ {
+ _M_impl->_M_remove_reference();
+ throw;
+ }
+ delete [] _M_impl->_M_names[0];
+ _M_impl->_M_names[0] = 0;
+ }
+ template<typename _Facet>
+ locale
+ locale::
+ combine(const locale& __other) const
+ {
+ _Impl* __tmp = new _Impl(*_M_impl, 1);
+ try
+ {
+ __tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
+ }
+ catch(...)
+ {
+ __tmp->_M_remove_reference();
+ throw;
+ }
+ return locale(__tmp);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ bool
+ locale::
+ operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
+ const basic_string<_CharT, _Traits, _Alloc>& __s2) const
+ {
+ typedef std::collate<_CharT> __collate_type;
+ const __collate_type& __collate = use_facet<__collate_type>(*this);
+ return (__collate.compare(__s1.data(), __s1.data() + __s1.length(),
+ __s2.data(), __s2.data() + __s2.length()) < 0);
+ }
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw()
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ return (__i < __loc._M_impl->_M_facets_size
+ && dynamic_cast<const _Facet*>(__facets[__i]));
+ }
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc)
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
+ __throw_bad_cast();
+ return dynamic_cast<const _Facet&>(*__facets[__i]);
+ }
+ template<typename _CharT>
+ int
+ collate<_CharT>::_M_compare(const _CharT*, const _CharT*) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ size_t
+ collate<_CharT>::_M_transform(_CharT*, const _CharT*, size_t) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ int
+ collate<_CharT>::
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ {
+ const string_type __one(__lo1, __hi1);
+ const string_type __two(__lo2, __hi2);
+ const _CharT* __p = __one.c_str();
+ const _CharT* __pend = __one.data() + __one.length();
+ const _CharT* __q = __two.c_str();
+ const _CharT* __qend = __two.data() + __two.length();
+ for (;;)
+ {
+ const int __res = _M_compare(__p, __q);
+ if (__res)
+ return __res;
+ __p += char_traits<_CharT>::length(__p);
+ __q += char_traits<_CharT>::length(__q);
+ if (__p == __pend && __q == __qend)
+ return 0;
+ else if (__p == __pend)
+ return -1;
+ else if (__q == __qend)
+ return 1;
+ __p++;
+ __q++;
+ }
+ }
+ template<typename _CharT>
+ typename collate<_CharT>::string_type
+ collate<_CharT>::
+ do_transform(const _CharT* __lo, const _CharT* __hi) const
+ {
+ string_type __ret;
+ const string_type __str(__lo, __hi);
+ const _CharT* __p = __str.c_str();
+ const _CharT* __pend = __str.data() + __str.length();
+ size_t __len = (__hi - __lo) * 2;
+ _CharT* __c = new _CharT[__len];
+ try
+ {
+ for (;;)
+ {
+ size_t __res = _M_transform(__c, __p, __len);
+ if (__res >= __len)
+ {
+ __len = __res + 1;
+ delete [] __c, __c = 0;
+ __c = new _CharT[__len];
+ __res = _M_transform(__c, __p, __len);
+ }
+ __ret.append(__c, __res);
+ __p += char_traits<_CharT>::length(__p);
+ if (__p == __pend)
+ break;
+ __p++;
+ __ret.push_back(_CharT());
+ }
+ }
+ catch(...)
+ {
+ delete [] __c;
+ throw;
+ }
+ delete [] __c;
+ return __ret;
+ }
+ template<typename _CharT>
+ long
+ collate<_CharT>::
+ do_hash(const _CharT* __lo, const _CharT* __hi) const
+ {
+ unsigned long __val = 0;
+ for (; __lo < __hi; ++__lo)
+ __val =
+ *__lo + ((__val << 7)
+ | (__val >> (__gnu_cxx::__numeric_traits<unsigned long>::
+ __digits - 7)));
+ return static_cast<long>(__val);
+ }
+ extern template class collate<char>;
+ extern template class collate_byname<char>;
+ extern template
+ const collate<char>&
+ use_facet<collate<char> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<char> >(const locale&);
+ extern template class collate<wchar_t>;
+ extern template class collate_byname<wchar_t>;
+ extern template
+ const collate<wchar_t>&
+ use_facet<collate<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<wchar_t> >(const locale&);
+}
+namespace std {
+ enum _Ios_Fmtflags
+ {
+ _S_boolalpha = 1L << 0,
+ _S_dec = 1L << 1,
+ _S_fixed = 1L << 2,
+ _S_hex = 1L << 3,
+ _S_internal = 1L << 4,
+ _S_left = 1L << 5,
+ _S_oct = 1L << 6,
+ _S_right = 1L << 7,
+ _S_scientific = 1L << 8,
+ _S_showbase = 1L << 9,
+ _S_showpoint = 1L << 10,
+ _S_showpos = 1L << 11,
+ _S_skipws = 1L << 12,
+ _S_unitbuf = 1L << 13,
+ _S_uppercase = 1L << 14,
+ _S_adjustfield = _S_left | _S_right | _S_internal,
+ _S_basefield = _S_dec | _S_oct | _S_hex,
+ _S_floatfield = _S_scientific | _S_fixed,
+ _S_ios_fmtflags_end = 1L << 16
+ };
+ inline _Ios_Fmtflags
+ operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Fmtflags&
+ operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a | __b; }
+ inline _Ios_Fmtflags&
+ operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a & __b; }
+ inline _Ios_Fmtflags&
+ operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Fmtflags
+ operator~(_Ios_Fmtflags __a)
+ { return _Ios_Fmtflags(~static_cast<int>(__a)); }
+ enum _Ios_Openmode
+ {
+ _S_app = 1L << 0,
+ _S_ate = 1L << 1,
+ _S_bin = 1L << 2,
+ _S_in = 1L << 3,
+ _S_out = 1L << 4,
+ _S_trunc = 1L << 5,
+ _S_ios_openmode_end = 1L << 16
+ };
+ inline _Ios_Openmode
+ operator&(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator|(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator^(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Openmode&
+ operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a | __b; }
+ inline _Ios_Openmode&
+ operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a & __b; }
+ inline _Ios_Openmode&
+ operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Openmode
+ operator~(_Ios_Openmode __a)
+ { return _Ios_Openmode(~static_cast<int>(__a)); }
+ enum _Ios_Iostate
+ {
+ _S_goodbit = 0,
+ _S_badbit = 1L << 0,
+ _S_eofbit = 1L << 1,
+ _S_failbit = 1L << 2,
+ _S_ios_iostate_end = 1L << 16
+ };
+ inline _Ios_Iostate
+ operator&(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator|(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator^(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Iostate&
+ operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a | __b; }
+ inline _Ios_Iostate&
+ operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a & __b; }
+ inline _Ios_Iostate&
+ operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Iostate
+ operator~(_Ios_Iostate __a)
+ { return _Ios_Iostate(~static_cast<int>(__a)); }
+ enum _Ios_Seekdir
+ {
+ _S_beg = 0,
+ _S_cur = 1,
+ _S_end = 2,
+ _S_ios_seekdir_end = 1L << 16
+ };
+ class ios_base
+ {
+ public:
+ class failure : public exception
+ {
+ public:
+ explicit
+ failure(const string& __str) throw();
+ virtual
+ ~failure() throw();
+ virtual const char*
+ what() const throw();
+ private:
+ string _M_msg;
+ };
+ typedef _Ios_Fmtflags fmtflags;
+ static const fmtflags boolalpha = _S_boolalpha;
+ static const fmtflags dec = _S_dec;
+ static const fmtflags fixed = _S_fixed;
+ static const fmtflags hex = _S_hex;
+ static const fmtflags internal = _S_internal;
+ static const fmtflags left = _S_left;
+ static const fmtflags oct = _S_oct;
+ static const fmtflags right = _S_right;
+ static const fmtflags scientific = _S_scientific;
+ static const fmtflags showbase = _S_showbase;
+ static const fmtflags showpoint = _S_showpoint;
+ static const fmtflags showpos = _S_showpos;
+ static const fmtflags skipws = _S_skipws;
+ static const fmtflags unitbuf = _S_unitbuf;
+ static const fmtflags uppercase = _S_uppercase;
+ static const fmtflags adjustfield = _S_adjustfield;
+ static const fmtflags basefield = _S_basefield;
+ static const fmtflags floatfield = _S_floatfield;
+ typedef _Ios_Iostate iostate;
+ static const iostate badbit = _S_badbit;
+ static const iostate eofbit = _S_eofbit;
+ static const iostate failbit = _S_failbit;
+ static const iostate goodbit = _S_goodbit;
+ typedef _Ios_Openmode openmode;
+ static const openmode app = _S_app;
+ static const openmode ate = _S_ate;
+ static const openmode binary = _S_bin;
+ static const openmode in = _S_in;
+ static const openmode out = _S_out;
+ static const openmode trunc = _S_trunc;
+ typedef _Ios_Seekdir seekdir;
+ static const seekdir beg = _S_beg;
+ static const seekdir cur = _S_cur;
+ static const seekdir end = _S_end;
+ typedef int io_state;
+ typedef int open_mode;
+ typedef int seek_dir;
+ typedef std::streampos streampos;
+ typedef std::streamoff streamoff;
+ enum event
+ {
+ erase_event,
+ imbue_event,
+ copyfmt_event
+ };
+ typedef void (*event_callback) (event, ios_base&, int);
+ void
+ register_callback(event_callback __fn, int __index);
+ protected:
+ streamsize _M_precision;
+ streamsize _M_width;
+ fmtflags _M_flags;
+ iostate _M_exception;
+ iostate _M_streambuf_state;
+ struct _Callback_list
+ {
+ _Callback_list* _M_next;
+ ios_base::event_callback _M_fn;
+ int _M_index;
+ _Atomic_word _M_refcount;
+ _Callback_list(ios_base::event_callback __fn, int __index,
+ _Callback_list* __cb)
+ : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
+ void
+ _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ int
+ _M_remove_reference()
+ { return __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); }
+ };
+ _Callback_list* _M_callbacks;
+ void
+ _M_call_callbacks(event __ev) throw();
+ void
+ _M_dispose_callbacks(void) throw();
+ struct _Words
+ {
+ void* _M_pword;
+ long _M_iword;
+ _Words() : _M_pword(0), _M_iword(0) { }
+ };
+ _Words _M_word_zero;
+ enum { _S_local_word_size = 8 };
+ _Words _M_local_word[_S_local_word_size];
+ int _M_word_size;
+ _Words* _M_word;
+ _Words&
+ _M_grow_words(int __index, bool __iword);
+ locale _M_ios_locale;
+ void
+ _M_init() throw();
+ public:
+ class Init
+ {
+ friend class ios_base;
+ public:
+ Init();
+ ~Init();
+ private:
+ static _Atomic_word _S_refcount;
+ static bool _S_synced_with_stdio;
+ };
+ fmtflags
+ flags() const
+ { return _M_flags; }
+ fmtflags
+ flags(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags = __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags |= __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl, fmtflags __mask)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags &= ~__mask;
+ _M_flags |= (__fmtfl & __mask);
+ return __old;
+ }
+ void
+ unsetf(fmtflags __mask)
+ { _M_flags &= ~__mask; }
+ streamsize
+ precision() const
+ { return _M_precision; }
+ streamsize
+ precision(streamsize __prec)
+ {
+ streamsize __old = _M_precision;
+ _M_precision = __prec;
+ return __old;
+ }
+ streamsize
+ width() const
+ { return _M_width; }
+ streamsize
+ width(streamsize __wide)
+ {
+ streamsize __old = _M_width;
+ _M_width = __wide;
+ return __old;
+ }
+ static bool
+ sync_with_stdio(bool __sync = true);
+ locale
+ imbue(const locale& __loc) throw();
+ locale
+ getloc() const
+ { return _M_ios_locale; }
+ const locale&
+ _M_getloc() const
+ { return _M_ios_locale; }
+ static int
+ xalloc() throw();
+ long&
+ iword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, true);
+ return __word._M_iword;
+ }
+ void*&
+ pword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, false);
+ return __word._M_pword;
+ }
+ virtual ~ios_base();
+ protected:
+ ios_base() throw ();
+ private:
+ ios_base(const ios_base&);
+ ios_base&
+ operator=(const ios_base&);
+ };
+ inline ios_base&
+ boolalpha(ios_base& __base)
+ {
+ __base.setf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ noboolalpha(ios_base& __base)
+ {
+ __base.unsetf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ showbase(ios_base& __base)
+ {
+ __base.setf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ noshowbase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ showpoint(ios_base& __base)
+ {
+ __base.setf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ noshowpoint(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ showpos(ios_base& __base)
+ {
+ __base.setf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ noshowpos(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ skipws(ios_base& __base)
+ {
+ __base.setf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ noskipws(ios_base& __base)
+ {
+ __base.unsetf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ uppercase(ios_base& __base)
+ {
+ __base.setf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ nouppercase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ unitbuf(ios_base& __base)
+ {
+ __base.setf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ nounitbuf(ios_base& __base)
+ {
+ __base.unsetf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ internal(ios_base& __base)
+ {
+ __base.setf(ios_base::internal, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ left(ios_base& __base)
+ {
+ __base.setf(ios_base::left, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ right(ios_base& __base)
+ {
+ __base.setf(ios_base::right, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ dec(ios_base& __base)
+ {
+ __base.setf(ios_base::dec, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ hex(ios_base& __base)
+ {
+ __base.setf(ios_base::hex, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ oct(ios_base& __base)
+ {
+ __base.setf(ios_base::oct, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ fixed(ios_base& __base)
+ {
+ __base.setf(ios_base::fixed, ios_base::floatfield);
+ return __base;
+ }
+ inline ios_base&
+ scientific(ios_base& __base)
+ {
+ __base.setf(ios_base::scientific, ios_base::floatfield);
+ return __base;
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
+ basic_streambuf<_CharT, _Traits>*, bool&);
+ template<typename _CharT, typename _Traits>
+ class basic_streambuf
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename traits_type::int_type int_type;
+ typedef typename traits_type::pos_type pos_type;
+ typedef typename traits_type::off_type off_type;
+ typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ friend class basic_ios<char_type, traits_type>;
+ friend class basic_istream<char_type, traits_type>;
+ friend class basic_ostream<char_type, traits_type>;
+ friend class istreambuf_iterator<char_type, traits_type>;
+ friend class ostreambuf_iterator<char_type, traits_type>;
+ friend streamsize
+ __copy_streambufs_eof<>(__streambuf_type*, __streambuf_type*, bool&);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ template<typename _CharT2, typename _Traits2>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ getline(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);
+ protected:
+ char_type* _M_in_beg;
+ char_type* _M_in_cur;
+ char_type* _M_in_end;
+ char_type* _M_out_beg;
+ char_type* _M_out_cur;
+ char_type* _M_out_end;
+ locale _M_buf_locale;
+ public:
+ virtual
+ ~basic_streambuf()
+ { }
+ locale
+ pubimbue(const locale &__loc)
+ {
+ locale __tmp(this->getloc());
+ this->imbue(__loc);
+ _M_buf_locale = __loc;
+ return __tmp;
+ }
+ locale
+ getloc() const
+ { return _M_buf_locale; }
+ __streambuf_type*
+ pubsetbuf(char_type* __s, streamsize __n)
+ { return this->setbuf(__s, __n); }
+ pos_type
+ pubseekoff(off_type __off, ios_base::seekdir __way,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekoff(__off, __way, __mode); }
+ pos_type
+ pubseekpos(pos_type __sp,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekpos(__sp, __mode); }
+ int
+ pubsync() { return this->sync(); }
+ streamsize
+ in_avail()
+ {
+ const streamsize __ret = this->egptr() - this->gptr();
+ return __ret ? __ret : this->showmanyc();
+ }
+ int_type
+ snextc()
+ {
+ int_type __ret = traits_type::eof();
+ if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
+ __ret), true))
+ __ret = this->sgetc();
+ return __ret;
+ }
+ int_type
+ sbumpc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ else
+ __ret = this->uflow();
+ return __ret;
+ }
+ int_type
+ sgetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ __ret = traits_type::to_int_type(*this->gptr());
+ else
+ __ret = this->underflow();
+ return __ret;
+ }
+ streamsize
+ sgetn(char_type* __s, streamsize __n)
+ { return this->xsgetn(__s, __n); }
+ int_type
+ sputbackc(char_type __c)
+ {
+ int_type __ret;
+ const bool __testpos = this->eback() < this->gptr();
+ if (__builtin_expect(!__testpos ||
+ !traits_type::eq(__c, this->gptr()[-1]), false))
+ __ret = this->pbackfail(traits_type::to_int_type(__c));
+ else
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ return __ret;
+ }
+ int_type
+ sungetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->eback() < this->gptr(), true))
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ else
+ __ret = this->pbackfail();
+ return __ret;
+ }
+ int_type
+ sputc(char_type __c)
+ {
+ int_type __ret;
+ if (__builtin_expect(this->pptr() < this->epptr(), true))
+ {
+ *this->pptr() = __c;
+ this->pbump(1);
+ __ret = traits_type::to_int_type(__c);
+ }
+ else
+ __ret = this->overflow(traits_type::to_int_type(__c));
+ return __ret;
+ }
+ streamsize
+ sputn(const char_type* __s, streamsize __n)
+ { return this->xsputn(__s, __n); }
+ protected:
+ basic_streambuf()
+ : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
+ _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
+ _M_buf_locale(locale())
+ { }
+ char_type*
+ eback() const { return _M_in_beg; }
+ char_type*
+ gptr() const { return _M_in_cur; }
+ char_type*
+ egptr() const { return _M_in_end; }
+ void
+ gbump(int __n) { _M_in_cur += __n; }
+ void
+ setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
+ {
+ _M_in_beg = __gbeg;
+ _M_in_cur = __gnext;
+ _M_in_end = __gend;
+ }
+ char_type*
+ pbase() const { return _M_out_beg; }
+ char_type*
+ pptr() const { return _M_out_cur; }
+ char_type*
+ epptr() const { return _M_out_end; }
+ void
+ pbump(int __n) { _M_out_cur += __n; }
+ void
+ setp(char_type* __pbeg, char_type* __pend)
+ {
+ _M_out_beg = _M_out_cur = __pbeg;
+ _M_out_end = __pend;
+ }
+ virtual void
+ imbue(const locale&)
+ { }
+ virtual basic_streambuf<char_type,_Traits>*
+ setbuf(char_type*, streamsize)
+ { return this; }
+ virtual pos_type
+ seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual pos_type
+ seekpos(pos_type,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual int
+ sync() { return 0; }
+ virtual streamsize
+ showmanyc() { return 0; }
+ virtual streamsize
+ xsgetn(char_type* __s, streamsize __n);
+ virtual int_type
+ underflow()
+ { return traits_type::eof(); }
+ virtual int_type
+ uflow()
+ {
+ int_type __ret = traits_type::eof();
+ const bool __testeof = traits_type::eq_int_type(this->underflow(),
+ __ret);
+ if (!__testeof)
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ return __ret;
+ }
+ virtual int_type
+ pbackfail(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ virtual streamsize
+ xsputn(const char_type* __s, streamsize __n);
+ virtual int_type
+ overflow(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ public:
+ void
+ stossc()
+ {
+ if (this->gptr() < this->egptr())
+ this->gbump(1);
+ else
+ this->uflow();
+ }
+ private:
+ basic_streambuf(const __streambuf_type& __sb)
+ : _M_in_beg(__sb._M_in_beg), _M_in_cur(__sb._M_in_cur),
+ _M_in_end(__sb._M_in_end), _M_out_beg(__sb._M_out_beg),
+ _M_out_cur(__sb._M_out_cur), _M_out_end(__sb._M_out_cur),
+ _M_buf_locale(__sb._M_buf_locale)
+ { }
+ __streambuf_type&
+ operator=(const __streambuf_type&) { return *this; };
+ };
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>* __sbin,
+ basic_streambuf<char>* __sbout, bool& __ineof);
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
+ basic_streambuf<wchar_t>* __sbout, bool& __ineof);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsgetn(char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->egptr() - this->gptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(__s, this->gptr(), __len);
+ __ret += __len;
+ __s += __len;
+ this->gbump(__len);
+ }
+ if (__ret < __n)
+ {
+ const int_type __c = this->uflow();
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ traits_type::assign(*__s++, traits_type::to_char_type(__c));
+ ++__ret;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsputn(const char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->epptr() - this->pptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(this->pptr(), __s, __len);
+ __ret += __len;
+ __s += __len;
+ this->pbump(__len);
+ }
+ if (__ret < __n)
+ {
+ int_type __c = this->overflow(traits_type::to_int_type(*__s));
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ ++__ret;
+ ++__s;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout,
+ bool& __ineof)
+ {
+ streamsize __ret = 0;
+ __ineof = true;
+ typename _Traits::int_type __c = __sbin->sgetc();
+ while (!_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __c = __sbout->sputc(_Traits::to_char_type(__c));
+ if (_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __ineof = false;
+ break;
+ }
+ ++__ret;
+ __c = __sbin->snextc();
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ inline streamsize
+ __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout)
+ {
+ bool __ineof;
+ return __copy_streambufs_eof(__sbin, __sbout, __ineof);
+ }
+ extern template class basic_streambuf<char>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<char>*,
+ basic_streambuf<char>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>*,
+ basic_streambuf<char>*, bool&);
+ extern template class basic_streambuf<wchar_t>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*, bool&);
+}
+
+
+
+extern "C" {
+typedef int wctype_t;
+typedef int wctrans_t;
+int __attribute__((__cdecl__)) iswalpha (wint_t);
+int __attribute__((__cdecl__)) iswalnum (wint_t);
+int __attribute__((__cdecl__)) iswblank (wint_t);
+int __attribute__((__cdecl__)) iswcntrl (wint_t);
+int __attribute__((__cdecl__)) iswctype (wint_t, wctype_t);
+int __attribute__((__cdecl__)) iswdigit (wint_t);
+int __attribute__((__cdecl__)) iswgraph (wint_t);
+int __attribute__((__cdecl__)) iswlower (wint_t);
+int __attribute__((__cdecl__)) iswprint (wint_t);
+int __attribute__((__cdecl__)) iswpunct (wint_t);
+int __attribute__((__cdecl__)) iswspace (wint_t);
+int __attribute__((__cdecl__)) iswupper (wint_t);
+int __attribute__((__cdecl__)) iswxdigit (wint_t);
+wint_t __attribute__((__cdecl__)) towctrans (wint_t, wctrans_t);
+wint_t __attribute__((__cdecl__)) towupper (wint_t);
+wint_t __attribute__((__cdecl__)) towlower (wint_t);
+wctrans_t __attribute__((__cdecl__)) wctrans (const char *);
+wctype_t __attribute__((__cdecl__)) wctype (const char *);
+}
+namespace std {
+ using ::wctrans_t;
+ using ::wctype_t;
+ using ::wint_t;
+ using ::iswalnum;
+ using ::iswalpha;
+ using ::iswblank;
+ using ::iswcntrl;
+ using ::iswctype;
+ using ::iswdigit;
+ using ::iswgraph;
+ using ::iswlower;
+ using ::iswprint;
+ using ::iswpunct;
+ using ::iswspace;
+ using ::iswupper;
+ using ::iswxdigit;
+ using ::towctrans;
+ using ::towlower;
+ using ::towupper;
+ using ::wctrans;
+ using ::wctype;
+}
+
+namespace std {
+ struct ctype_base
+ {
+ typedef const int* __to_type;
+ typedef char mask;
+ static const mask upper = 01;
+ static const mask lower = 02;
+ static const mask alpha = 01 | 02;
+ static const mask digit = 04;
+ static const mask xdigit = 0100 | 04;
+ static const mask space = 010;
+ static const mask print = 020 | 01 | 02 | 04 | 0200;
+ static const mask graph = 020 | 01 | 02 | 04;
+ static const mask cntrl = 040;
+ static const mask punct = 020;
+ static const mask alnum = 01 | 02 | 04;
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator
+ : public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
+ _CharT*, _CharT&>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_istream<_CharT, _Traits> istream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ private:
+ mutable streambuf_type* _M_sbuf;
+ mutable int_type _M_c;
+ public:
+ istreambuf_iterator() throw()
+ : _M_sbuf(0), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(istream_type& __s) throw()
+ : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(streambuf_type* __s) throw()
+ : _M_sbuf(__s), _M_c(traits_type::eof()) { }
+ char_type
+ operator*() const
+ {
+ return traits_type::to_char_type(_M_get());
+ }
+ istreambuf_iterator&
+ operator++()
+ {
+ ;
+ if (_M_sbuf)
+ {
+ _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return *this;
+ }
+ istreambuf_iterator
+ operator++(int)
+ {
+ ;
+ istreambuf_iterator __old = *this;
+ if (_M_sbuf)
+ {
+ __old._M_c = _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return __old;
+ }
+ bool
+ equal(const istreambuf_iterator& __b) const
+ { return _M_at_eof() == __b._M_at_eof(); }
+ private:
+ int_type
+ _M_get() const
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __ret = __eof;
+ if (_M_sbuf)
+ {
+ if (!traits_type::eq_int_type(_M_c, __eof))
+ __ret = _M_c;
+ else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()),
+ __eof))
+ _M_c = __ret;
+ else
+ _M_sbuf = 0;
+ }
+ return __ret;
+ }
+ bool
+ _M_at_eof() const
+ {
+ const int_type __eof = traits_type::eof();
+ return traits_type::eq_int_type(_M_get(), __eof);
+ }
+ };
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return __a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator!=(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return !__a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ private:
+ streambuf_type* _M_sbuf;
+ bool _M_failed;
+ public:
+ ostreambuf_iterator(ostream_type& __s) throw ()
+ : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator(streambuf_type* __s) throw ()
+ : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator&
+ operator=(_CharT __c)
+ {
+ if (!_M_failed &&
+ _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
+ _M_failed = true;
+ return *this;
+ }
+ ostreambuf_iterator&
+ operator*()
+ { return *this; }
+ ostreambuf_iterator&
+ operator++(int)
+ { return *this; }
+ ostreambuf_iterator&
+ operator++()
+ { return *this; }
+ bool
+ failed() const throw()
+ { return _M_failed; }
+ ostreambuf_iterator&
+ _M_put(const _CharT* __ws, streamsize __len)
+ {
+ if (__builtin_expect(!_M_failed, true)
+ && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len,
+ false))
+ _M_failed = true;
+ return *this;
+ }
+ };
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ copy(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed)
+ {
+ bool __ineof;
+ __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof);
+ if (!__ineof)
+ __result._M_failed = true;
+ }
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(_CharT* __first, _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(const _CharT* __first, const _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, _CharT* __result)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ const streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ traits_type::copy(__result, __sb->gptr(), __n);
+ __sb->gbump(__n);
+ __result += __n;
+ __c = __sb->underflow();
+ }
+ else
+ {
+ *__result++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ }
+ }
+ }
+ return __result;
+ }
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ istreambuf_iterator<_CharT> >::__type
+ find(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, const _CharT& __val)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ const int_type __ival = traits_type::to_int_type(__val);
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof())
+ && !traits_type::eq_int_type(__c, __ival))
+ {
+ streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ const _CharT* __p = traits_type::find(__sb->gptr(),
+ __n, __val);
+ if (__p)
+ __n = __p - __sb->gptr();
+ __sb->gbump(__n);
+ __c = __sb->sgetc();
+ }
+ else
+ __c = __sb->snextc();
+ }
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ __first._M_c = __c;
+ else
+ __first._M_sbuf = 0;
+ }
+ return __first;
+ }
+}
+namespace std {
+ template<typename _Tp>
+ void
+ __convert_to_v(const char*, _Tp&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, float&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, long double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<typename _CharT, typename _Traits>
+ struct __pad
+ {
+ static void
+ _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
+ const _CharT* __olds, streamsize __newlen, streamsize __oldlen);
+ };
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last);
+ template<typename _CharT>
+ inline
+ ostreambuf_iterator<_CharT>
+ __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
+ {
+ __s._M_put(__ws, __len);
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ inline
+ _OutIter
+ __write(_OutIter __s, const _CharT* __ws, int __len)
+ {
+ for (int __j = 0; __j < __len; __j++, ++__s)
+ *__s = __ws[__j];
+ return __s;
+ }
+ template<typename _CharT>
+ class __ctype_abstract_base : public locale::facet, public ctype_base
+ {
+ public:
+ typedef _CharT char_type;
+ bool
+ is(mask __m, char_type __c) const
+ { return this->do_is(__m, __c); }
+ const char_type*
+ is(const char_type *__lo, const char_type *__hi, mask *__vec) const
+ { return this->do_is(__lo, __hi, __vec); }
+ const char_type*
+ scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_is(__m, __lo, __hi); }
+ const char_type*
+ scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_not(__m, __lo, __hi); }
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ { return this->do_widen(__c); }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ { return this->do_widen(__lo, __hi, __to); }
+ char
+ narrow(char_type __c, char __dfault) const
+ { return this->do_narrow(__c, __dfault); }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ { return this->do_narrow(__lo, __hi, __dfault, __to); }
+ protected:
+ explicit
+ __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
+ virtual
+ ~__ctype_abstract_base() { }
+ virtual bool
+ do_is(mask __m, char_type __c) const = 0;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi,
+ mask* __vec) const = 0;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual char_type
+ do_toupper(char_type) const = 0;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_tolower(char_type) const = 0;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_widen(char) const = 0;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi,
+ char_type* __dest) const = 0;
+ virtual char
+ do_narrow(char_type, char __dfault) const = 0;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const = 0;
+ };
+ template<typename _CharT>
+ class ctype : public __ctype_abstract_base<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename __ctype_abstract_base<_CharT>::mask mask;
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
+ protected:
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type __c) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type __c) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ };
+ template<typename _CharT>
+ locale::id ctype<_CharT>::id;
+ template<>
+ class ctype<char> : public locale::facet, public ctype_base
+ {
+ public:
+ typedef char char_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_del;
+ __to_type _M_toupper;
+ __to_type _M_tolower;
+ const mask* _M_table;
+ mutable char _M_widen_ok;
+ mutable char _M_widen[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow_ok;
+ public:
+ static locale::id id;
+ static const size_t table_size = 1 + static_cast<unsigned char>(-1);
+ explicit
+ ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
+ size_t __refs = 0);
+ inline bool
+ is(mask __m, char __c) const;
+ inline const char*
+ is(const char* __lo, const char* __hi, mask* __vec) const;
+ inline const char*
+ scan_is(mask __m, const char* __lo, const char* __hi) const;
+ inline const char*
+ scan_not(mask __m, const char* __lo, const char* __hi) const;
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ {
+ if (_M_widen_ok)
+ return _M_widen[static_cast<unsigned char>(__c)];
+ this->_M_widen_init();
+ return this->do_widen(__c);
+ }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ {
+ if (_M_widen_ok == 1)
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_widen_ok)
+ _M_widen_init();
+ return this->do_widen(__lo, __hi, __to);
+ }
+ char
+ narrow(char_type __c, char __dfault) const
+ {
+ if (_M_narrow[static_cast<unsigned char>(__c)])
+ return _M_narrow[static_cast<unsigned char>(__c)];
+ const char __t = do_narrow(__c, __dfault);
+ if (__t != __dfault)
+ _M_narrow[static_cast<unsigned char>(__c)] = __t;
+ return __t;
+ }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ {
+ if (__builtin_expect(_M_narrow_ok == 1, true))
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_narrow_ok)
+ _M_narrow_init();
+ return this->do_narrow(__lo, __hi, __dfault, __to);
+ }
+ const mask*
+ table() const throw()
+ { return _M_table; }
+ static const mask*
+ classic_table() throw();
+ protected:
+ virtual
+ ~ctype();
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const
+ { return __c; }
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ virtual char
+ do_narrow(char_type __c, char) const
+ { return __c; }
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char, char* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ private:
+ void _M_narrow_init() const;
+ void _M_widen_init() const;
+ };
+ template<>
+ class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
+ {
+ public:
+ typedef wchar_t char_type;
+ typedef wctype_t __wmask_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_narrow_ok;
+ char _M_narrow[128];
+ wint_t _M_widen[1 + static_cast<unsigned char>(-1)];
+ mask _M_bit[16];
+ __wmask_type _M_wmask[16];
+ public:
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, size_t __refs = 0);
+ protected:
+ __wmask_type
+ _M_convert_to_wmask(const mask __m) const throw();
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ void
+ _M_initialize_ctype() throw();
+ };
+ template<typename _CharT>
+ class ctype_byname : public ctype<_CharT>
+ {
+ public:
+ typedef typename ctype<_CharT>::mask mask;
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname() { };
+ };
+ template<>
+ class ctype_byname<char> : public ctype<char>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+ template<>
+ class ctype_byname<wchar_t> : public ctype<wchar_t>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+}
+namespace std {
+ bool
+ ctype<char>::
+ is(mask __m, char __c) const
+ { return _M_table[static_cast<unsigned char>(__c)] & __m; }
+ const char*
+ ctype<char>::
+ is(const char* __low, const char* __high, mask* __vec) const
+ {
+ while (__low < __high)
+ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
+ return __high;
+ }
+ const char*
+ ctype<char>::
+ scan_is(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && !this->is(__m, *__low))
+ ++__low;
+ return __low;
+ }
+ const char*
+ ctype<char>::
+ scan_not(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && this->is(__m, *__low) != 0)
+ ++__low;
+ return __low;
+ }
+}
+namespace std {
+ class __num_base
+ {
+ public:
+ enum
+ {
+ _S_ominus,
+ _S_oplus,
+ _S_ox,
+ _S_oX,
+ _S_odigits,
+ _S_odigits_end = _S_odigits + 16,
+ _S_oudigits = _S_odigits_end,
+ _S_oudigits_end = _S_oudigits + 16,
+ _S_oe = _S_odigits + 14,
+ _S_oE = _S_oudigits + 14,
+ _S_oend = _S_oudigits_end
+ };
+ static const char* _S_atoms_out;
+ static const char* _S_atoms_in;
+ enum
+ {
+ _S_iminus,
+ _S_iplus,
+ _S_ix,
+ _S_iX,
+ _S_izero,
+ _S_ie = _S_izero + 14,
+ _S_iE = _S_izero + 20,
+ _S_iend = 26
+ };
+ static void
+ _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw();
+ };
+ template<typename _CharT>
+ struct __numpunct_cache : public locale::facet
+ {
+ const char* _M_grouping;
+ size_t _M_grouping_size;
+ bool _M_use_grouping;
+ const _CharT* _M_truename;
+ size_t _M_truename_size;
+ const _CharT* _M_falsename;
+ size_t _M_falsename_size;
+ _CharT _M_decimal_point;
+ _CharT _M_thousands_sep;
+ _CharT _M_atoms_out[__num_base::_S_oend];
+ _CharT _M_atoms_in[__num_base::_S_iend];
+ bool _M_allocated;
+ __numpunct_cache(size_t __refs = 0) : facet(__refs),
+ _M_grouping(__null), _M_grouping_size(0), _M_use_grouping(false),
+ _M_truename(__null), _M_truename_size(0), _M_falsename(__null),
+ _M_falsename_size(0), _M_decimal_point(_CharT()),
+ _M_thousands_sep(_CharT()), _M_allocated(false)
+ { }
+ ~__numpunct_cache();
+ void
+ _M_cache(const locale& __loc);
+ private:
+ __numpunct_cache&
+ operator=(const __numpunct_cache&);
+ explicit
+ __numpunct_cache(const __numpunct_cache&);
+ };
+ template<typename _CharT>
+ __numpunct_cache<_CharT>::~__numpunct_cache()
+ {
+ if (_M_allocated)
+ {
+ delete [] _M_grouping;
+ delete [] _M_truename;
+ delete [] _M_falsename;
+ }
+ }
+ template<typename _CharT>
+ class numpunct : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ protected:
+ __cache_type* _M_data;
+ public:
+ static locale::id id;
+ explicit
+ numpunct(size_t __refs = 0) : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__cache_type* __cache, size_t __refs = 0)
+ : facet(__refs), _M_data(__cache)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(__cloc); }
+ char_type
+ decimal_point() const
+ { return this->do_decimal_point(); }
+ char_type
+ thousands_sep() const
+ { return this->do_thousands_sep(); }
+ string
+ grouping() const
+ { return this->do_grouping(); }
+ string_type
+ truename() const
+ { return this->do_truename(); }
+ string_type
+ falsename() const
+ { return this->do_falsename(); }
+ protected:
+ virtual
+ ~numpunct();
+ virtual char_type
+ do_decimal_point() const
+ { return _M_data->_M_decimal_point; }
+ virtual char_type
+ do_thousands_sep() const
+ { return _M_data->_M_thousands_sep; }
+ virtual string
+ do_grouping() const
+ { return _M_data->_M_grouping; }
+ virtual string_type
+ do_truename() const
+ { return _M_data->_M_truename; }
+ virtual string_type
+ do_falsename() const
+ { return _M_data->_M_falsename; }
+ void
+ _M_initialize_numpunct(__c_locale __cloc = __null);
+ };
+ template<typename _CharT>
+ locale::id numpunct<_CharT>::id;
+ template<>
+ numpunct<char>::~numpunct();
+ template<>
+ void
+ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
+ template<>
+ numpunct<wchar_t>::~numpunct();
+ template<>
+ void
+ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
+ template<typename _CharT>
+ class numpunct_byname : public numpunct<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ numpunct_byname(const char* __s, size_t __refs = 0)
+ : numpunct<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ __c_locale __tmp;
+ this->_S_create_c_locale(__tmp, __s);
+ this->_M_initialize_numpunct(__tmp);
+ this->_S_destroy_c_locale(__tmp);
+ }
+ }
+ protected:
+ virtual
+ ~numpunct_byname() { }
+ };
+
+ template<typename _CharT, typename _InIter>
+ class num_get : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _InIter iter_type;
+ static locale::id id;
+ explicit
+ num_get(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ protected:
+ virtual ~num_get() { }
+ iter_type
+ _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ string&) const;
+ template<typename _ValueT>
+ iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ _ValueT&) const;
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
+ _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ if (__len <= 10)
+ {
+ if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
+ __ret = __c - _CharT2('0');
+ }
+ else
+ {
+ if (__c >= _CharT2('0') && __c <= _CharT2('9'))
+ __ret = __c - _CharT2('0');
+ else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
+ __ret = 10 + (__c - _CharT2('a'));
+ else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
+ __ret = 10 + (__c - _CharT2('A'));
+ }
+ return __ret;
+ }
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
+ int>::__type
+ _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
+ if (__q)
+ {
+ __ret = __q - __zero;
+ if (__ret > 15)
+ __ret -= 6;
+ }
+ return __ret;
+ }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ float&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ long double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ void*&) const;
+ };
+ template<typename _CharT, typename _InIter>
+ locale::id num_get<_CharT, _InIter>::id;
+ template<typename _CharT, typename _OutIter>
+ class num_put : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _OutIter iter_type;
+ static locale::id id;
+ explicit
+ num_put(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ long double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ const void* __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ protected:
+ template<typename _ValueT>
+ iter_type
+ _M_insert_float(iter_type, ios_base& __io, char_type __fill,
+ char __mod, _ValueT __v) const;
+ void
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ char_type __sep, const char_type* __p, char_type* __new,
+ char_type* __cs, int& __len) const;
+ template<typename _ValueT>
+ iter_type
+ _M_insert_int(iter_type, ios_base& __io, char_type __fill,
+ _ValueT __v) const;
+ void
+ _M_group_int(const char* __grouping, size_t __grouping_size,
+ char_type __sep, ios_base& __io, char_type* __new,
+ char_type* __cs, int& __len) const;
+ void
+ _M_pad(char_type __fill, streamsize __w, ios_base& __io,
+ char_type* __new, const char_type* __cs, int& __len) const;
+ virtual
+ ~num_put() { };
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
+ };
+ template <typename _CharT, typename _OutIter>
+ locale::id num_put<_CharT, _OutIter>::id;
+
+ template<typename _CharT>
+ inline bool
+ isspace(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
+ template<typename _CharT>
+ inline bool
+ isprint(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
+ template<typename _CharT>
+ inline bool
+ iscntrl(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
+ template<typename _CharT>
+ inline bool
+ isupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
+ template<typename _CharT>
+ inline bool
+ islower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
+ template<typename _CharT>
+ inline bool
+ isalpha(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
+ template<typename _CharT>
+ inline bool
+ isdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
+ template<typename _CharT>
+ inline bool
+ ispunct(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
+ template<typename _CharT>
+ inline bool
+ isxdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
+ template<typename _CharT>
+ inline bool
+ isalnum(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
+ template<typename _CharT>
+ inline bool
+ isgraph(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
+ template<typename _CharT>
+ inline _CharT
+ toupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
+ template<typename _CharT>
+ inline _CharT
+ tolower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
+}
+
+namespace std {
+ template<typename _Facet>
+ struct __use_cache
+ {
+ const _Facet*
+ operator() (const locale& __loc) const;
+ };
+ template<typename _CharT>
+ struct __use_cache<__numpunct_cache<_CharT> >
+ {
+ const __numpunct_cache<_CharT>*
+ operator() (const locale& __loc) const
+ {
+ const size_t __i = numpunct<_CharT>::id._M_id();
+ const locale::facet** __caches = __loc._M_impl->_M_caches;
+ if (!__caches[__i])
+ {
+ __numpunct_cache<_CharT>* __tmp = __null;
+ try
+ {
+ __tmp = new __numpunct_cache<_CharT>;
+ __tmp->_M_cache(__loc);
+ }
+ catch(...)
+ {
+ delete __tmp;
+ throw;
+ }
+ __loc._M_impl->_M_install_cache(__tmp, __i);
+ }
+ return static_cast<const __numpunct_cache<_CharT>*>(__caches[__i]);
+ }
+ };
+ template<typename _CharT>
+ void
+ __numpunct_cache<_CharT>::_M_cache(const locale& __loc)
+ {
+ _M_allocated = true;
+ const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
+ char* __grouping = 0;
+ _CharT* __truename = 0;
+ _CharT* __falsename = 0;
+ try
+ {
+ _M_grouping_size = __np.grouping().size();
+ __grouping = new char[_M_grouping_size];
+ __np.grouping().copy(__grouping, _M_grouping_size);
+ _M_grouping = __grouping;
+ _M_use_grouping = (_M_grouping_size
+ && static_cast<signed char>(_M_grouping[0]) > 0
+ && (_M_grouping[0]
+ != __gnu_cxx::__numeric_traits<char>::__max));
+ _M_truename_size = __np.truename().size();
+ __truename = new _CharT[_M_truename_size];
+ __np.truename().copy(__truename, _M_truename_size);
+ _M_truename = __truename;
+ _M_falsename_size = __np.falsename().size();
+ __falsename = new _CharT[_M_falsename_size];
+ __np.falsename().copy(__falsename, _M_falsename_size);
+ _M_falsename = __falsename;
+ _M_decimal_point = __np.decimal_point();
+ _M_thousands_sep = __np.thousands_sep();
+ const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
+ __ct.widen(__num_base::_S_atoms_out,
+ __num_base::_S_atoms_out
+ + __num_base::_S_oend, _M_atoms_out);
+ __ct.widen(__num_base::_S_atoms_in,
+ __num_base::_S_atoms_in
+ + __num_base::_S_iend, _M_atoms_in);
+ }
+ catch(...)
+ {
+ delete [] __grouping;
+ delete [] __truename;
+ delete [] __falsename;
+ throw;
+ }
+ }
+ __attribute__ ((__pure__)) bool
+ __verify_grouping(const char* __grouping, size_t __grouping_size,
+ const string& __grouping_tmp) throw ();
+
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_float(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, string& __xtrc) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ bool __testeof = __beg == __end;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ __xtrc += __plus ? '+' : '-';
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_mantissa = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero])
+ {
+ if (!__found_mantissa)
+ {
+ __xtrc += '0';
+ __found_mantissa = true;
+ }
+ ++__sep_pos;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ break;
+ }
+ bool __found_dec = false;
+ bool __found_sci = false;
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ const int __digit = _M_find(__lit_zero, 10, __c);
+ if (__digit != -1)
+ {
+ __xtrc += '0' + __digit;
+ __found_mantissa = true;
+ }
+ else if (__c == __lc->_M_decimal_point
+ && !__found_dec && !__found_sci)
+ {
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if (__plus || __c == __lit[__num_base::_S_iminus])
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __xtrc.clear();
+ break;
+ }
+ }
+ else
+ break;
+ }
+ else if (__c == __lc->_M_decimal_point)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__found_grouping.size())
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else
+ break;
+ }
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, 10, __c);
+ if (__q)
+ {
+ __xtrc += '0' + (__q - __lit_zero);
+ __found_mantissa = true;
+ ++__sep_pos;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ if (__found_grouping.size() && !__found_dec)
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping
+ && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ if (!__found_dec && !__found_sci)
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ template<typename _ValueT>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, _ValueT& __v) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ const ios_base::fmtflags __basefield = __io.flags()
+ & ios_base::basefield;
+ const bool __oct = __basefield == ios_base::oct;
+ int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);
+ bool __testeof = __beg == __end;
+ bool __negative = false;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ __negative = __c == __lit[__num_base::_S_iminus];
+ if ((__negative || __c == __lit[__num_base::_S_iplus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_zero = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero]
+ && (!__found_zero || __base == 10))
+ {
+ __found_zero = true;
+ ++__sep_pos;
+ if (__basefield == 0)
+ __base = 8;
+ if (__base == 8)
+ __sep_pos = 0;
+ }
+ else if (__found_zero
+ && (__c == __lit[__num_base::_S_ix]
+ || __c == __lit[__num_base::_S_iX]))
+ {
+ if (__basefield == 0)
+ __base = 16;
+ if (__base == 16)
+ {
+ __found_zero = false;
+ __sep_pos = 0;
+ }
+ else
+ break;
+ }
+ else
+ break;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ if (!__found_zero)
+ break;
+ }
+ else
+ __testeof = true;
+ }
+ const size_t __len = (__base == 16 ? __num_base::_S_iend
+ - __num_base::_S_izero : __base);
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ bool __testfail = false;
+ bool __testoverflow = false;
+ const __unsigned_type __max =
+ (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ ? -__gnu_cxx::__numeric_traits<_ValueT>::__min
+ : __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ const __unsigned_type __smax = __max / __base;
+ __unsigned_type __result = 0;
+ int __digit = 0;
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ __digit = _M_find(__lit_zero, __len, __c);
+ if (__digit == -1)
+ break;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __testfail = true;
+ break;
+ }
+ }
+ else if (__c == __lc->_M_decimal_point)
+ break;
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, __len, __c);
+ if (!__q)
+ break;
+ __digit = __q - __lit_zero;
+ if (__digit > 15)
+ __digit -= 6;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ if ((!__sep_pos && !__found_zero && !__found_grouping.size())
+ || __testfail)
+ {
+ __v = 0;
+ __err = ios_base::failbit;
+ }
+ else if (__testoverflow)
+ {
+ if (__negative
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__min;
+ else
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ __err = ios_base::failbit;
+ }
+ else
+ __v = __negative ? -__result : __result;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ {
+ if (!(__io.flags() & ios_base::boolalpha))
+ {
+ long __l = -1;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __l);
+ if (__l == 0 || __l == 1)
+ __v = bool(__l);
+ else
+ {
+ __v = true;
+ __err = ios_base::failbit;
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ }
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ bool __testf = true;
+ bool __testt = true;
+ bool __donef = __lc->_M_falsename_size == 0;
+ bool __donet = __lc->_M_truename_size == 0;
+ bool __testeof = false;
+ size_t __n = 0;
+ while (!__donef || !__donet)
+ {
+ if (__beg == __end)
+ {
+ __testeof = true;
+ break;
+ }
+ const char_type __c = *__beg;
+ if (!__donef)
+ __testf = __c == __lc->_M_falsename[__n];
+ if (!__testf && __donet)
+ break;
+ if (!__donet)
+ __testt = __c == __lc->_M_truename[__n];
+ if (!__testt && __donef)
+ break;
+ if (!__testt && !__testf)
+ break;
+ ++__n;
+ ++__beg;
+ __donef = !__testf || __n >= __lc->_M_falsename_size;
+ __donet = !__testt || __n >= __lc->_M_truename_size;
+ }
+ if (__testf && __n == __lc->_M_falsename_size && __n)
+ {
+ __v = false;
+ if (__testt && __n == __lc->_M_truename_size)
+ __err = ios_base::failbit;
+ else
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else if (__testt && __n == __lc->_M_truename_size && __n)
+ {
+ __v = true;
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else
+ {
+ __v = false;
+ __err = ios_base::failbit;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ }
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ {
+ typedef ios_base::fmtflags fmtflags;
+ const fmtflags __fmt = __io.flags();
+ __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex);
+ typedef __gnu_cxx::__conditional_type<(sizeof(void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ _UIntPtrType __ul;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
+ __io.flags(__fmt);
+ __v = reinterpret_cast<void*>(__ul);
+ return __beg;
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_pad(_CharT __fill, streamsize __w, ios_base& __io,
+ _CharT* __new, const _CharT* __cs, int& __len) const
+ {
+ __pad<_CharT, char_traits<_CharT> >::_S_pad(__io, __fill, __new,
+ __cs, __w, __len);
+ __len = static_cast<int>(__w);
+ }
+
+ template<typename _CharT, typename _ValueT>
+ int
+ __int_to_char(_CharT* __bufend, _ValueT __v, const _CharT* __lit,
+ ios_base::fmtflags __flags, bool __dec)
+ {
+ _CharT* __buf = __bufend;
+ if (__builtin_expect(__dec, true))
+ {
+ do
+ {
+ *--__buf = __lit[(__v % 10) + __num_base::_S_odigits];
+ __v /= 10;
+ }
+ while (__v != 0);
+ }
+ else if ((__flags & ios_base::basefield) == ios_base::oct)
+ {
+ do
+ {
+ *--__buf = __lit[(__v & 0x7) + __num_base::_S_odigits];
+ __v >>= 3;
+ }
+ while (__v != 0);
+ }
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ const int __case_offset = __uppercase ? __num_base::_S_oudigits
+ : __num_base::_S_odigits;
+ do
+ {
+ *--__buf = __lit[(__v & 0xf) + __case_offset];
+ __v >>= 4;
+ }
+ while (__v != 0);
+ }
+ return __bufend - __buf;
+ }
+
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_int(const char* __grouping, size_t __grouping_size, _CharT __sep,
+ ios_base&, _CharT* __new, _CharT* __cs, int& __len) const
+ {
+ _CharT* __p = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size, __cs, __cs + __len);
+ __len = __p - __new;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
+ _ValueT __v) const
+ {
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_out;
+ const ios_base::fmtflags __flags = __io.flags();
+ const int __ilen = 5 * sizeof(_ValueT);
+ _CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __ilen));
+ const ios_base::fmtflags __basefield = __flags & ios_base::basefield;
+ const bool __dec = (__basefield != ios_base::oct
+ && __basefield != ios_base::hex);
+ const __unsigned_type __u = ((__v > 0 || !__dec)
+ ? __unsigned_type(__v)
+ : -__unsigned_type(__v));
+ int __len = __int_to_char(__cs + __ilen, __u, __lit, __flags, __dec);
+ __cs += __ilen - __len;
+ if (__lc->_M_use_grouping)
+ {
+ _CharT* __cs2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * (__len + 1)
+ * 2));
+ _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __io, __cs2 + 2, __cs, __len);
+ __cs = __cs2 + 2;
+ }
+ if (__builtin_expect(__dec, true))
+ {
+ if (__v >= 0)
+ {
+ if (bool(__flags & ios_base::showpos)
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ *--__cs = __lit[__num_base::_S_oplus], ++__len;
+ }
+ else
+ *--__cs = __lit[__num_base::_S_ominus], ++__len;
+ }
+ else if (bool(__flags & ios_base::showbase) && __v)
+ {
+ if (__basefield == ios_base::oct)
+ *--__cs = __lit[__num_base::_S_odigits], ++__len;
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ *--__cs = __lit[__num_base::_S_ox + __uppercase];
+ *--__cs = __lit[__num_base::_S_odigits];
+ __len += 2;
+ }
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __cs3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __cs3, __cs, __len);
+ __cs = __cs3;
+ }
+ __io.width(0);
+ return std::__write(__s, __cs, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ _CharT __sep, const _CharT* __p, _CharT* __new,
+ _CharT* __cs, int& __len) const
+ {
+ const int __declen = __p ? __p - __cs : __len;
+ _CharT* __p2 = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size,
+ __cs, __cs + __declen);
+ int __newlen = __p2 - __new;
+ if (__p)
+ {
+ char_traits<_CharT>::copy(__p2, __p, __len - __declen);
+ __newlen += __len - __declen;
+ }
+ __len = __newlen;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
+ _ValueT __v) const
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const streamsize __prec = __io.precision() < 0 ? 6 : __io.precision();
+ const int __max_digits =
+ __gnu_cxx::__numeric_traits<_ValueT>::__digits10;
+ int __len;
+ char __fbuf[16];
+ __num_base::_S_format_float(__io, __fbuf, __mod);
+ const bool __fixed = __io.flags() & ios_base::fixed;
+ const int __max_exp =
+ __gnu_cxx::__numeric_traits<_ValueT>::__max_exponent10;
+ const int __cs_size = __fixed ? __max_exp + __prec + 4
+ : __max_digits * 2 + __prec;
+ char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
+ __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, __fbuf,
+ __prec, __v);
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len));
+ __ctype.widen(__cs, __cs + __len, __ws);
+ _CharT* __wp = 0;
+ const char* __p = char_traits<char>::find(__cs, __len, '.');
+ if (__p)
+ {
+ __wp = __ws + (__p - __cs);
+ *__wp = __lc->_M_decimal_point;
+ }
+ if (__lc->_M_use_grouping
+ && (__wp || __len < 3 || (__cs[1] <= '9' && __cs[2] <= '9'
+ && __cs[1] >= '0' && __cs[2] >= '0')))
+ {
+ _CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len * 2));
+ streamsize __off = 0;
+ if (__cs[0] == '-' || __cs[0] == '+')
+ {
+ __off = 1;
+ __ws2[0] = __ws[0];
+ __len -= 1;
+ }
+ _M_group_float(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __wp, __ws2 + __off,
+ __ws + __off, __len);
+ __len += __off;
+ __ws = __ws2;
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __ws3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __ws3, __ws, __len);
+ __ws = __ws3;
+ }
+ __io.width(0);
+ return std::__write(__s, __ws, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ if ((__flags & ios_base::boolalpha) == 0)
+ {
+ const long __l = __v;
+ __s = _M_insert_int(__s, __io, __fill, __l);
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __name = __v ? __lc->_M_truename
+ : __lc->_M_falsename;
+ int __len = __v ? __lc->_M_truename_size
+ : __lc->_M_falsename_size;
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ const streamsize __plen = __w - __len;
+ _CharT* __ps
+ = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __plen));
+ char_traits<_CharT>::assign(__ps, __plen, __fill);
+ __io.width(0);
+ if ((__flags & ios_base::adjustfield) == ios_base::left)
+ {
+ __s = std::__write(__s, __name, __len);
+ __s = std::__write(__s, __ps, __plen);
+ }
+ else
+ {
+ __s = std::__write(__s, __ps, __plen);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ __io.width(0);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
+ { return _M_insert_float(__s, __io, __fill, char(), __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long double __v) const
+ { return _M_insert_float(__s, __io, __fill, 'L', __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ const void* __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ const ios_base::fmtflags __fmt = ~(ios_base::basefield
+ | ios_base::uppercase);
+ __io.flags((__flags & __fmt) | (ios_base::hex | ios_base::showbase));
+ typedef __gnu_cxx::__conditional_type<(sizeof(const void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ __s = _M_insert_int(__s, __io, __fill,
+ reinterpret_cast<_UIntPtrType>(__v));
+ __io.flags(__flags);
+ return __s;
+ }
+
+ template<typename _CharT, typename _Traits>
+ void
+ __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill,
+ _CharT* __news, const _CharT* __olds,
+ streamsize __newlen, streamsize __oldlen)
+ {
+ const size_t __plen = static_cast<size_t>(__newlen - __oldlen);
+ const ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;
+ if (__adjust == ios_base::left)
+ {
+ _Traits::copy(__news, __olds, __oldlen);
+ _Traits::assign(__news + __oldlen, __plen, __fill);
+ return;
+ }
+ size_t __mod = 0;
+ if (__adjust == ios_base::internal)
+ {
+ const locale& __loc = __io._M_getloc();
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ if (__ctype.widen('-') == __olds[0]
+ || __ctype.widen('+') == __olds[0])
+ {
+ __news[0] = __olds[0];
+ __mod = 1;
+ ++__news;
+ }
+ else if (__ctype.widen('0') == __olds[0]
+ && __oldlen > 1
+ && (__ctype.widen('x') == __olds[1]
+ || __ctype.widen('X') == __olds[1]))
+ {
+ __news[0] = __olds[0];
+ __news[1] = __olds[1];
+ __mod = 2;
+ __news += 2;
+ }
+ }
+ _Traits::assign(__news, __plen, __fill);
+ _Traits::copy(__news + __plen, __olds + __mod, __oldlen - __mod);
+ }
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last)
+ {
+ size_t __idx = 0;
+ size_t __ctr = 0;
+ while (__last - __first > __gbeg[__idx]
+ && static_cast<signed char>(__gbeg[__idx]) > 0
+ && __gbeg[__idx] != __gnu_cxx::__numeric_traits<char>::__max)
+ {
+ __last -= __gbeg[__idx];
+ __idx < __gsize - 1 ? ++__idx : ++__ctr;
+ }
+ while (__first != __last)
+ *__s++ = *__first++;
+ while (__ctr--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ while (__idx--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ return __s;
+ }
+ extern template class numpunct<char>;
+ extern template class numpunct_byname<char>;
+ extern template class num_get<char>;
+ extern template class num_put<char>;
+ extern template class ctype_byname<char>;
+ extern template
+ const ctype<char>&
+ use_facet<ctype<char> >(const locale&);
+ extern template
+ const numpunct<char>&
+ use_facet<numpunct<char> >(const locale&);
+ extern template
+ const num_put<char>&
+ use_facet<num_put<char> >(const locale&);
+ extern template
+ const num_get<char>&
+ use_facet<num_get<char> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<char> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<char> >(const locale&);
+ extern template class numpunct<wchar_t>;
+ extern template class numpunct_byname<wchar_t>;
+ extern template class num_get<wchar_t>;
+ extern template class num_put<wchar_t>;
+ extern template class ctype_byname<wchar_t>;
+ extern template
+ const ctype<wchar_t>&
+ use_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ const numpunct<wchar_t>&
+ use_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ const num_put<wchar_t>&
+ use_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ const num_get<wchar_t>&
+ use_facet<num_get<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<wchar_t> >(const locale&);
+}
+namespace std {
+ template<typename _Facet>
+ inline const _Facet&
+ __check_facet(const _Facet* __f)
+ {
+ if (!__f)
+ __throw_bad_cast();
+ return *__f;
+ }
+ template<typename _CharT, typename _Traits>
+ class basic_ios : public ios_base
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ protected:
+ basic_ostream<_CharT, _Traits>* _M_tie;
+ mutable char_type _M_fill;
+ mutable bool _M_fill_init;
+ basic_streambuf<_CharT, _Traits>* _M_streambuf;
+ const __ctype_type* _M_ctype;
+ const __num_put_type* _M_num_put;
+ const __num_get_type* _M_num_get;
+ public:
+ operator void*() const
+ { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
+ bool
+ operator!() const
+ { return this->fail(); }
+ iostate
+ rdstate() const
+ { return _M_streambuf_state; }
+ void
+ clear(iostate __state = goodbit);
+ void
+ setstate(iostate __state)
+ { this->clear(this->rdstate() | __state); }
+ void
+ _M_setstate(iostate __state)
+ {
+ _M_streambuf_state |= __state;
+ if (this->exceptions() & __state)
+ throw;
+ }
+ bool
+ good() const
+ { return this->rdstate() == 0; }
+ bool
+ eof() const
+ { return (this->rdstate() & eofbit) != 0; }
+ bool
+ fail() const
+ { return (this->rdstate() & (badbit | failbit)) != 0; }
+ bool
+ bad() const
+ { return (this->rdstate() & badbit) != 0; }
+ iostate
+ exceptions() const
+ { return _M_exception; }
+ void
+ exceptions(iostate __except)
+ {
+ _M_exception = __except;
+ this->clear(_M_streambuf_state);
+ }
+ explicit
+ basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
+ : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
+ _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { this->init(__sb); }
+ virtual
+ ~basic_ios() { }
+ basic_ostream<_CharT, _Traits>*
+ tie() const
+ { return _M_tie; }
+ basic_ostream<_CharT, _Traits>*
+ tie(basic_ostream<_CharT, _Traits>* __tiestr)
+ {
+ basic_ostream<_CharT, _Traits>* __old = _M_tie;
+ _M_tie = __tiestr;
+ return __old;
+ }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf() const
+ { return _M_streambuf; }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
+ basic_ios&
+ copyfmt(const basic_ios& __rhs);
+ char_type
+ fill() const
+ {
+ if (!_M_fill_init)
+ {
+ _M_fill = this->widen(' ');
+ _M_fill_init = true;
+ }
+ return _M_fill;
+ }
+ char_type
+ fill(char_type __ch)
+ {
+ char_type __old = this->fill();
+ _M_fill = __ch;
+ return __old;
+ }
+ locale
+ imbue(const locale& __loc);
+ char
+ narrow(char_type __c, char __dfault) const
+ { return __check_facet(_M_ctype).narrow(__c, __dfault); }
+ char_type
+ widen(char __c) const
+ { return __check_facet(_M_ctype).widen(__c); }
+ protected:
+ basic_ios()
+ : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
+ _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { }
+ void
+ init(basic_streambuf<_CharT, _Traits>* __sb);
+ void
+ _M_cache_locale(const locale& __loc);
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::clear(iostate __state)
+ {
+ if (this->rdbuf())
+ _M_streambuf_state = __state;
+ else
+ _M_streambuf_state = __state | badbit;
+ if (this->exceptions() & this->rdstate())
+ __throw_ios_failure(("basic_ios::clear"));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_streambuf<_CharT, _Traits>*
+ basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ basic_streambuf<_CharT, _Traits>* __old = _M_streambuf;
+ _M_streambuf = __sb;
+ this->clear();
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ios<_CharT, _Traits>&
+ basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
+ {
+ if (this != &__rhs)
+ {
+ _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ?
+ _M_local_word : new _Words[__rhs._M_word_size];
+ _Callback_list* __cb = __rhs._M_callbacks;
+ if (__cb)
+ __cb->_M_add_reference();
+ _M_call_callbacks(erase_event);
+ if (_M_word != _M_local_word)
+ {
+ delete [] _M_word;
+ _M_word = 0;
+ }
+ _M_dispose_callbacks();
+ _M_callbacks = __cb;
+ for (int __i = 0; __i < __rhs._M_word_size; ++__i)
+ __words[__i] = __rhs._M_word[__i];
+ _M_word = __words;
+ _M_word_size = __rhs._M_word_size;
+ this->flags(__rhs.flags());
+ this->width(__rhs.width());
+ this->precision(__rhs.precision());
+ this->tie(__rhs.tie());
+ this->fill(__rhs.fill());
+ _M_ios_locale = __rhs.getloc();
+ _M_cache_locale(_M_ios_locale);
+ _M_call_callbacks(copyfmt_event);
+ this->exceptions(__rhs.exceptions());
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ locale
+ basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
+ {
+ locale __old(this->getloc());
+ ios_base::imbue(__loc);
+ _M_cache_locale(__loc);
+ if (this->rdbuf() != 0)
+ this->rdbuf()->pubimbue(__loc);
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ ios_base::_M_init();
+ _M_cache_locale(_M_ios_locale);
+ _M_fill = _CharT();
+ _M_fill_init = false;
+ _M_tie = 0;
+ _M_exception = goodbit;
+ _M_streambuf = __sb;
+ _M_streambuf_state = __sb ? goodbit : badbit;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc)
+ {
+ if (__builtin_expect(has_facet<__ctype_type>(__loc), true))
+ _M_ctype = &use_facet<__ctype_type>(__loc);
+ else
+ _M_ctype = 0;
+ if (__builtin_expect(has_facet<__num_put_type>(__loc), true))
+ _M_num_put = &use_facet<__num_put_type>(__loc);
+ else
+ _M_num_put = 0;
+ if (__builtin_expect(has_facet<__num_get_type>(__loc), true))
+ _M_num_get = &use_facet<__num_get_type>(__loc);
+ else
+ _M_num_get = 0;
+ }
+ extern template class basic_ios<char>;
+ extern template class basic_ios<wchar_t>;
+}
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef ctype<_CharT> __ctype_type;
+ explicit
+ basic_ostream(__streambuf_type* __sb)
+ { this->init(__sb); }
+ virtual
+ ~basic_ostream() { }
+ class sentry;
+ friend class sentry;
+ __ostream_type&
+ operator<<(__ostream_type& (*__pf)(__ostream_type&))
+ {
+ return __pf(*this);
+ }
+ __ostream_type&
+ operator<<(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(ios_base& (*__pf) (ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(bool __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(short __n);
+ __ostream_type&
+ operator<<(unsigned short __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(int __n);
+ __ostream_type&
+ operator<<(unsigned int __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(float __f)
+ {
+ return _M_insert(static_cast<double>(__f));
+ }
+ __ostream_type&
+ operator<<(long double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(const void* __p)
+ { return _M_insert(__p); }
+ __ostream_type&
+ operator<<(__streambuf_type* __sb);
+ __ostream_type&
+ put(char_type __c);
+ void
+ _M_write(const char_type* __s, streamsize __n)
+ {
+ const streamsize __put = this->rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ this->setstate(ios_base::badbit);
+ }
+ __ostream_type&
+ write(const char_type* __s, streamsize __n);
+ __ostream_type&
+ flush();
+ pos_type
+ tellp();
+ __ostream_type&
+ seekp(pos_type);
+ __ostream_type&
+ seekp(off_type, ios_base::seekdir);
+ protected:
+ basic_ostream()
+ { this->init(0); }
+ template<typename _ValueT>
+ __ostream_type&
+ _M_insert(_ValueT __v);
+ };
+ template <typename _CharT, typename _Traits>
+ class basic_ostream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ basic_ostream<_CharT, _Traits>& _M_os;
+ public:
+ explicit
+ sentry(basic_ostream<_CharT, _Traits>& __os);
+ ~sentry()
+ {
+ if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
+ {
+ if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
+ _M_os.setstate(ios_base::badbit);
+ }
+ }
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
+ { return (__out << __out.widen(__c)); }
+ template <class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, char __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits> &
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits> &
+ operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ endl(basic_ostream<_CharT, _Traits>& __os)
+ { return flush(__os.put(__os.widen('\n'))); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ ends(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.put(_CharT()); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ flush(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.flush(); }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>::sentry::
+ sentry(basic_ostream<_CharT, _Traits>& __os)
+ : _M_ok(false), _M_os(__os)
+ {
+ if (__os.tie() && __os.good())
+ __os.tie()->flush();
+ if (__os.good())
+ _M_ok = true;
+ else
+ __os.setstate(ios_base::failbit);
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ _M_insert(_ValueT __v)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_put_type& __np = __check_facet(this->_M_num_put);
+ if (__np.put(*this, *this, this->fill(), __v).failed())
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(short __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(int __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(__streambuf_type* __sbin)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this);
+ if (__cerb && __sbin)
+ {
+ try
+ {
+ if (!__copy_streambufs(__sbin, this->rdbuf()))
+ __err |= ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbin)
+ __err |= ios_base::badbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ put(char_type __c)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __put = this->rdbuf()->sputc(__c);
+ if (traits_type::eq_int_type(__put, traits_type::eof()))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ write(const _CharT* __s, streamsize __n)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ try
+ { _M_write(__s, __n); }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ flush()
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_ostream<_CharT, _Traits>::pos_type
+ basic_ostream<_CharT, _Traits>::
+ tellp()
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ {
+ const size_t __clen = char_traits<char>::length(__s);
+ try
+ {
+ struct __ptr_guard
+ {
+ _CharT *__p;
+ __ptr_guard (_CharT *__ip): __p(__ip) { }
+ ~__ptr_guard() { delete[] __p; }
+ _CharT* __get() { return __p; }
+ } __pg (new _CharT[__clen]);
+ _CharT *__ws = __pg.__get();
+ for (size_t __i = 0; __i < __clen; ++__i)
+ __ws[__i] = __out.widen(__s[__i]);
+ __ostream_insert(__out, __ws, __clen);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template class basic_ostream<char>;
+ extern template ostream& endl(ostream&);
+ extern template ostream& ends(ostream&);
+ extern template ostream& flush(ostream&);
+ extern template ostream& operator<<(ostream&, char);
+ extern template ostream& operator<<(ostream&, unsigned char);
+ extern template ostream& operator<<(ostream&, signed char);
+ extern template ostream& operator<<(ostream&, const char*);
+ extern template ostream& operator<<(ostream&, const unsigned char*);
+ extern template ostream& operator<<(ostream&, const signed char*);
+ extern template ostream& ostream::_M_insert(long);
+ extern template ostream& ostream::_M_insert(unsigned long);
+ extern template ostream& ostream::_M_insert(bool);
+ extern template ostream& ostream::_M_insert(long long);
+ extern template ostream& ostream::_M_insert(unsigned long long);
+ extern template ostream& ostream::_M_insert(double);
+ extern template ostream& ostream::_M_insert(long double);
+ extern template ostream& ostream::_M_insert(const void*);
+ extern template class basic_ostream<wchar_t>;
+ extern template wostream& endl(wostream&);
+ extern template wostream& ends(wostream&);
+ extern template wostream& flush(wostream&);
+ extern template wostream& operator<<(wostream&, wchar_t);
+ extern template wostream& operator<<(wostream&, char);
+ extern template wostream& operator<<(wostream&, const wchar_t*);
+ extern template wostream& operator<<(wostream&, const char*);
+ extern template wostream& wostream::_M_insert(long);
+ extern template wostream& wostream::_M_insert(unsigned long);
+ extern template wostream& wostream::_M_insert(bool);
+ extern template wostream& wostream::_M_insert(long long);
+ extern template wostream& wostream::_M_insert(unsigned long long);
+ extern template wostream& wostream::_M_insert(double);
+ extern template wostream& wostream::_M_insert(long double);
+ extern template wostream& wostream::_M_insert(const void*);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_istream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ typedef ctype<_CharT> __ctype_type;
+ protected:
+ streamsize _M_gcount;
+ public:
+ explicit
+ basic_istream(__streambuf_type* __sb)
+ : _M_gcount(streamsize(0))
+ { this->init(__sb); }
+ virtual
+ ~basic_istream()
+ { _M_gcount = streamsize(0); }
+ class sentry;
+ friend class sentry;
+ __istream_type&
+ operator>>(__istream_type& (*__pf)(__istream_type&))
+ { return __pf(*this); }
+ __istream_type&
+ operator>>(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(ios_base& (*__pf)(ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(bool& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(short& __n);
+ __istream_type&
+ operator>>(unsigned short& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(int& __n);
+ __istream_type&
+ operator>>(unsigned int& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(float& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(long double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(void*& __p)
+ { return _M_extract(__p); }
+ __istream_type&
+ operator>>(__streambuf_type* __sb);
+ streamsize
+ gcount() const
+ { return _M_gcount; }
+ int_type
+ get();
+ __istream_type&
+ get(char_type& __c);
+ __istream_type&
+ get(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ get(char_type* __s, streamsize __n)
+ { return this->get(__s, __n, this->widen('\n')); }
+ __istream_type&
+ get(__streambuf_type& __sb, char_type __delim);
+ __istream_type&
+ get(__streambuf_type& __sb)
+ { return this->get(__sb, this->widen('\n')); }
+ __istream_type&
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ getline(char_type* __s, streamsize __n)
+ { return this->getline(__s, __n, this->widen('\n')); }
+ __istream_type&
+ ignore();
+ __istream_type&
+ ignore(streamsize __n);
+ __istream_type&
+ ignore(streamsize __n, int_type __delim);
+ int_type
+ peek();
+ __istream_type&
+ read(char_type* __s, streamsize __n);
+ streamsize
+ readsome(char_type* __s, streamsize __n);
+ __istream_type&
+ putback(char_type __c);
+ __istream_type&
+ unget();
+ int
+ sync();
+ pos_type
+ tellg();
+ __istream_type&
+ seekg(pos_type);
+ __istream_type&
+ seekg(off_type, ios_base::seekdir);
+ protected:
+ basic_istream()
+ : _M_gcount(streamsize(0))
+ { this->init(0); }
+ template<typename _ValueT>
+ __istream_type&
+ _M_extract(_ValueT& __v);
+ };
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n, int_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n, int_type __delim);
+ template<typename _CharT, typename _Traits>
+ class basic_istream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ public:
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::__ctype_type __ctype_type;
+ typedef typename _Traits::int_type __int_type;
+ explicit
+ sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __in, char* __s);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ class basic_iostream
+ : public basic_istream<_CharT, _Traits>,
+ public basic_ostream<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ explicit
+ basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
+ : __istream_type(__sb), __ostream_type(__sb) { }
+ virtual
+ ~basic_iostream() { }
+ protected:
+ basic_iostream()
+ : __istream_type(), __ostream_type() { }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __is);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>::sentry::
+ sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ if (__in.good())
+ {
+ if (__in.tie())
+ __in.tie()->flush();
+ if (!__noskip && bool(__in.flags() & ios_base::skipws))
+ {
+ const __int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ const __ctype_type& __ct = __check_facet(__in._M_ctype);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space,
+ traits_type::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ }
+ if (__in.good() && __err == ios_base::goodbit)
+ _M_ok = true;
+ else
+ {
+ __err |= ios_base::failbit;
+ __in.setstate(__err);
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ _M_extract(_ValueT& __v)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __v);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(short& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<short>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<short>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__max;
+ }
+ else
+ __n = short(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(int& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<int>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<int>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__max;
+ }
+ else
+ __n = int(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(__streambuf_type* __sbout)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, false);
+ if (__cerb && __sbout)
+ {
+ try
+ {
+ bool __ineof;
+ if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
+ __err |= ios_base::failbit;
+ if (__ineof)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::failbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbout)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ get(void)
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __c = __eof;
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ __c = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__c, __eof))
+ _M_gcount = 1;
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type& __c)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __cb = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__cb, traits_type::eof()))
+ {
+ _M_gcount = 1;
+ __c = traits_type::to_char_type(__cb);
+ }
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(__streambuf_type& __sb, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __this_sb = this->rdbuf();
+ int_type __c = __this_sb->sgetc();
+ char_type __c2 = traits_type::to_char_type(__c);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim)
+ && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
+ {
+ ++_M_gcount;
+ __c = __this_sb->snextc();
+ __c2 = traits_type::to_char_type(__c);
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ getline(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ ++_M_gcount;
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else
+ {
+ if (traits_type::eq_int_type(__c, __idelim))
+ {
+ __sb->sbumpc();
+ ++_M_gcount;
+ }
+ else
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
+ __err |= ios_base::eofbit;
+ else
+ _M_gcount = 1;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n, int_type __delim)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else if (traits_type::eq_int_type(__c, __delim))
+ {
+ if (_M_gcount
+ < __gnu_cxx::__numeric_traits<streamsize>::__max)
+ ++_M_gcount;
+ __sb->sbumpc();
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ peek(void)
+ {
+ int_type __c = traits_type::eof();
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __c = this->rdbuf()->sgetc();
+ if (traits_type::eq_int_type(__c, traits_type::eof()))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ read(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ _M_gcount = this->rdbuf()->sgetn(__s, __n);
+ if (_M_gcount != __n)
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_istream<_CharT, _Traits>::
+ readsome(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const streamsize __num = this->rdbuf()->in_avail();
+ if (__num > 0)
+ _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
+ else if (__num == -1)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return _M_gcount;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ putback(char_type __c)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ unget(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sungetc(), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ int
+ basic_istream<_CharT, _Traits>::
+ sync(void)
+ {
+ int __ret = -1;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __streambuf_type* __sb = this->rdbuf();
+ if (__sb)
+ {
+ if (__sb->pubsync() == -1)
+ __err |= ios_base::badbit;
+ else
+ __ret = 0;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::pos_type
+ basic_istream<_CharT, _Traits>::
+ tellg(void)
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
+ ios_base::in);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::int_type __int_type;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __int_type __cb = __in.rdbuf()->sbumpc();
+ if (!_Traits::eq_int_type(__cb, _Traits::eof()))
+ __c = _Traits::to_char_type(__cb);
+ else
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ if (__err)
+ __in.setstate(__err);
+ }
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename _Traits::int_type int_type;
+ typedef _CharT char_type;
+ typedef ctype<_CharT> __ctype_type;
+ streamsize __extracted = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ streamsize __num = __in.width();
+ if (__num <= 0)
+ __num = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ int_type __c = __sb->sgetc();
+ while (__extracted < __num - 1
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ *__s++ = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __sb->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ *__s = char_type();
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ }
+ if (!__extracted)
+ __err |= ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __in)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename __istream_type::int_type __int_type;
+ typedef ctype<_CharT> __ctype_type;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ while (!_Traits::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (_Traits::eq_int_type(__c, __eof))
+ __in.setstate(ios_base::eofbit);
+ return __in;
+ }
+ extern template class basic_istream<char>;
+ extern template istream& ws(istream&);
+ extern template istream& operator>>(istream&, char&);
+ extern template istream& operator>>(istream&, char*);
+ extern template istream& operator>>(istream&, unsigned char&);
+ extern template istream& operator>>(istream&, signed char&);
+ extern template istream& operator>>(istream&, unsigned char*);
+ extern template istream& operator>>(istream&, signed char*);
+ extern template istream& istream::_M_extract(unsigned short&);
+ extern template istream& istream::_M_extract(unsigned int&);
+ extern template istream& istream::_M_extract(long&);
+ extern template istream& istream::_M_extract(unsigned long&);
+ extern template istream& istream::_M_extract(bool&);
+ extern template istream& istream::_M_extract(long long&);
+ extern template istream& istream::_M_extract(unsigned long long&);
+ extern template istream& istream::_M_extract(float&);
+ extern template istream& istream::_M_extract(double&);
+ extern template istream& istream::_M_extract(long double&);
+ extern template istream& istream::_M_extract(void*&);
+ extern template class basic_iostream<char>;
+ extern template class basic_istream<wchar_t>;
+ extern template wistream& ws(wistream&);
+ extern template wistream& operator>>(wistream&, wchar_t&);
+ extern template wistream& operator>>(wistream&, wchar_t*);
+ extern template wistream& wistream::_M_extract(unsigned short&);
+ extern template wistream& wistream::_M_extract(unsigned int&);
+ extern template wistream& wistream::_M_extract(long&);
+ extern template wistream& wistream::_M_extract(unsigned long&);
+ extern template wistream& wistream::_M_extract(bool&);
+ extern template wistream& wistream::_M_extract(long long&);
+ extern template wistream& wistream::_M_extract(unsigned long long&);
+ extern template wistream& wistream::_M_extract(float&);
+ extern template wistream& wistream::_M_extract(double&);
+ extern template wistream& wistream::_M_extract(long double&);
+ extern template wistream& wistream::_M_extract(void*&);
+ extern template class basic_iostream<wchar_t>;
+}
+namespace std {
+ extern istream cin;
+ extern ostream cout;
+ extern ostream cerr;
+ extern ostream clog;
+ extern wistream wcin;
+ extern wostream wcout;
+ extern wostream wcerr;
+ extern wostream wclog;
+ static ios_base::Init __ioinit;
+}
+
+extern "C" {
+void __attribute__((__cdecl__)) __assert (const char *, int, const char *) __attribute__ ((__noreturn__));
+void __attribute__((__cdecl__)) __assert_func (const char *, int, const char *, const char *) __attribute__ ((__noreturn__));
+}
+int main() {
+ int sum = 0, factor = 10;
+ void (*ERROR_missing_result_type_before_the_local_function_parameter_macro_id10)(); typedef void (*boost_closure_auxXdeduce_result_tagX10X)( int ERROR_missing_result_type_before_the_local_function_parameter_macro_id10 ) ; typedef __typeof__(boost::type_of::ensure_obj(::boost::scope_exit::aux::wrap( ::boost::scope_exit::aux::deref( ERROR_missing_result_type_before_the_local_function_parameter_macro_id10, (boost_closure_auxXdeduce_result_tagX10X)0 ) ))) boost_closure_auxXdeduce_result_wrapX10X ; typedef boost_closure_auxXdeduce_result_wrapX10X::type boost_closure_auxXdeduce_result_captureX10X ; struct boost_closure_auxXdeduce_result_paramsX10X { typedef boost_closure_auxXdeduce_result_captureX10X function_ptr; }; typedef ::boost::remove_pointer< boost_closure_auxXdeduce_result_paramsX10X::function_ptr >::type boost_closure_auxXdeduce_result_function_typeX10X ; typedef ::boost::function_traits< boost_closure_auxXdeduce_result_function_typeX10X >::result_type boost_closure_auxXresult_typeX10X ; typedef void
 (*boost_se_tag_0_10)(int factor); typedef void (*boost_se_tag_1_10)(int & sum); typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(factor, (boost_se_tag_0_10)0)))) boost_se_wrapped_t_0_10; typedef boost_se_wrapped_t_0_10::type boost_se_capture_t_0_10; typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(& sum, (boost_se_tag_1_10)0)))) boost_se_wrapped_t_1_10; typedef boost_se_wrapped_t_1_10::type boost_se_capture_t_1_10; struct boost_se_params_t_10 { typedef boost_se_capture_t_0_10 boost_se_param_t_0_10; typedef boost_se_capture_t_1_10 boost_se_param_t_1_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_0_10 , boost_se_tag_0_10 > ) >::arg1_type boost_se_param_0_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_1_10 , boost_se_tag_1_10 > ) >::arg1_type boost_se_param_1_10; } boost_closure_auxXparamsX10X = { { boost::scope_exit::aux
::deref(factor, (boost_se_tag_0_10)0) } , { boost::scope_exit::aux::deref(& sum, (boost_se_tag_1_10)0) } }; ::boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< sizeof(boost_closure_auxXargsX) >::cmp1<0>::cmp2 > boost_closure_auxXargsX; boost_closure_auxXargsX.value = &boost_closure_auxXparamsX10X; class boost_closure_auxXfunctorX10X { typedef boost_closure_auxXresult_typeX10X (boost_closure_auxXfunction_typeX) ( int num ); typedef boost::function_traits< void ( ::boost::local::aux::function< boost_closure_auxXfunction_typeX , 0 > ) >::arg1_type boost_closure_auxXfunctor_typeX ; typedef ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type factorXtypeof_typeXboost_closure_auxX ; typedef boost_se_params_t_10:: boost_se_param_t_1_10 & sumXtypeof_typeXboost_closure_auxX ; public: inline explicit boost_closure_auxXfunctorX10X( void* bind_params) : boost_closure_auxXbindX0X ( static_cast< boost_se_params_t_10* >(bind_params)-> boost_se_param_0_10.value ) , boost_closure_auxXbind
X1X ( static_cast< boost_se_params_t_10* >(bind_params)-> boost_se_param_1_10.value ) { } inline boost_closure_auxXresult_typeX10X operator()( ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) const { return boost_closure_auxXbodyX( boost_closure_auxXbindX0X , boost_closure_auxXbindX1X , arg1 ); } inline static boost_closure_auxXresult_typeX10X boost_closure_auxXcallX0X( void* object , ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) { return static_cast< boost_closure_auxXfunctorX10X* >( object)->operator()( arg1 ); } inline static void boost_closure_auxXinit_callX( void* object, boost_closure_auxXfunctor_typeX& functor) { functor.boost_closure_auxXinit_callX(object, &boost_closure_auxXcallX0X ); } private: ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type & boost_closure_auxXbindX0X ; boost_se_params_t_10:: boost_se_param_t_1_10 & boost_closure_auxXbindX1
X ; boost::scope_exit::aux::undeclared boost_closure_auxXargsX; inline boost_closure_auxXresult_typeX10X boost_closure_auxXbodyX( ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type factor , boost_se_params_t_10:: boost_se_param_t_1_10 & sum , int num ) const {
+ sum += factor * num;
+ std::cout << "Summed: " << sum << std::endl;
+ } public: boost_closure_auxXfunctor_typeX boost_closure_auxXnon_recursiveX; } boost_closure_auxXaddX(boost_closure_auxXargsX.value); __typeof__(boost::type_of::ensure_obj(boost_closure_auxXaddX. boost_closure_auxXnon_recursiveX)) add; boost_closure_auxXaddX.boost_closure_auxXinit_callX( &boost_closure_auxXaddX, add);
+ add(1);
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add);
+ ((sum == 60) ? (void)0 : __assert_func ("02.cpp", 20, __PRETTY_FUNCTION__, "sum == 60"));
+ return 0;
+}

Added: sandbox/closure/b01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/b01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,17973 @@
+
+typedef int ptrdiff_t;
+typedef unsigned int size_t;
+namespace std {
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+
+namespace std {
+ namespace rel_ops
+ {
+ template <class _Tp>
+ inline bool
+ operator!=(const _Tp& __x, const _Tp& __y)
+ { return !(__x == __y); }
+ template <class _Tp>
+ inline bool
+ operator>(const _Tp& __x, const _Tp& __y)
+ { return __y < __x; }
+ template <class _Tp>
+ inline bool
+ operator<=(const _Tp& __x, const _Tp& __y)
+ { return !(__y < __x); }
+ template <class _Tp>
+ inline bool
+ operator>=(const _Tp& __x, const _Tp& __y)
+ { return !(__x < __y); }
+ }
+}
+
+
+
+
+namespace std {
+ template<typename _Tp>
+ inline void
+ swap(_Tp& __a, _Tp& __b)
+ {
+
+ _Tp __tmp = (__a);
+ __a = (__b);
+ __b = (__tmp);
+ }
+ template<typename _Tp, size_t _Nm>
+ inline void
+ swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+ {
+ for (size_t __n = 0; __n < _Nm; ++__n)
+ swap(__a[__n], __b[__n]);
+ }
+}
+namespace std {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair()
+ : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ template<class _U1, class _U2>
+ pair(const pair<_U1, _U2>& __p)
+ : first(__p.first),
+ second(__p.second) { }
+ };
+ template<class _T1, class _T2>
+ inline bool
+ operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first == __y.first && __x.second == __y.second; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first < __y.first
+ || (!(__y.first < __x.first) && __x.second < __y.second); }
+ template<class _T1, class _T2>
+ inline bool
+ operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x == __y); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __y < __x; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__y < __x); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x < __y); }
+ template<class _T1, class _T2>
+ inline pair<_T1, _T2>
+ make_pair(_T1 __x, _T2 __y)
+ { return pair<_T1, _T2>(__x, __y); }
+}
+extern "C" {
+extern "C" {
+}
+extern "C" {
+}
+extern "C" {
+typedef signed char __int8_t ;
+typedef unsigned char __uint8_t ;
+typedef signed short __int16_t;
+typedef unsigned short __uint16_t;
+typedef __int16_t __int_least16_t;
+typedef __uint16_t __uint_least16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+typedef __int32_t __int_least32_t;
+typedef __uint32_t __uint_least32_t;
+typedef signed long long __int64_t;
+typedef unsigned long long __uint64_t;
+
+}
+typedef void *_LOCK_T;
+extern "C"
+{
+void __cygwin_lock_init(_LOCK_T *);
+void __cygwin_lock_init_recursive(_LOCK_T *);
+void __cygwin_lock_fini(_LOCK_T *);
+void __cygwin_lock_lock(_LOCK_T *);
+int __cygwin_lock_trylock(_LOCK_T *);
+void __cygwin_lock_unlock(_LOCK_T *);
+}
+typedef long _off_t;
+typedef short __dev_t;
+typedef unsigned short __uid_t;
+typedef unsigned short __gid_t;
+__extension__ typedef long long _off64_t;
+typedef long _fpos_t;
+typedef _off64_t _fpos64_t;
+typedef int _ssize_t;
+typedef unsigned int wint_t;
+typedef struct
+{
+ int __count;
+ union
+ {
+ wint_t __wch;
+ unsigned char __wchb[4];
+ } __value;
+} _mbstate_t;
+typedef _LOCK_T _flock_t;
+typedef void *_iconv_t;
+typedef long int __off_t;
+typedef int __pid_t;
+__extension__ typedef long long int __loff_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+typedef unsigned long clock_t;
+typedef long time_t;
+struct timespec {
+ time_t tv_sec;
+ long tv_nsec;
+};
+struct itimerspec {
+ struct timespec it_interval;
+ struct timespec it_value;
+};
+typedef long daddr_t;
+typedef char * caddr_t;
+
+typedef int pid_t;
+typedef _ssize_t ssize_t;
+typedef unsigned short nlink_t;
+typedef long fd_mask;
+typedef struct _types_fd_set {
+ fd_mask fds_bits[(((64)+(((sizeof (fd_mask) * 8))-1))/((sizeof (fd_mask) * 8)))];
+} _types_fd_set;
+typedef unsigned long clockid_t;
+typedef unsigned long timer_t;
+typedef unsigned long useconds_t;
+typedef long suseconds_t;
+extern "C"
+{
+typedef signed char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+typedef long long int64_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+typedef signed char int_least8_t;
+typedef short int_least16_t;
+typedef int int_least32_t;
+typedef long long int_least64_t;
+typedef unsigned char uint_least8_t;
+typedef unsigned short uint_least16_t;
+typedef unsigned int uint_least32_t;
+typedef unsigned long long uint_least64_t;
+typedef signed char int_fast8_t;
+typedef int int_fast16_t;
+typedef int int_fast32_t;
+typedef long long int_fast64_t;
+typedef unsigned char uint_fast8_t;
+typedef unsigned int uint_fast16_t;
+typedef unsigned int uint_fast32_t;
+typedef unsigned long long uint_fast64_t;
+typedef int intptr_t;
+typedef unsigned int uintptr_t;
+typedef long long intmax_t;
+typedef unsigned long long uintmax_t;
+extern "C" {
+static __inline unsigned short
+bswap_16 (unsigned short __x)
+{
+ return (__x >> 8) | (__x << 8);
+}
+static __inline unsigned int
+bswap_32 (unsigned int __x)
+{
+ return (bswap_16 (__x & 0xffff) << 16) | (bswap_16 (__x >> 16));
+}
+static __inline unsigned long long
+bswap_64 (unsigned long long __x)
+{
+ return (((unsigned long long) bswap_32 (__x & 0xffffffffull)) << 32) | (bswap_32 (__x >> 32));
+}
+}
+typedef struct timespec timespec_t;
+typedef struct timespec timestruc_t;
+typedef _off64_t off_t;
+typedef __loff_t loff_t;
+typedef short __dev16_t;
+typedef unsigned long __dev32_t;
+typedef __dev32_t dev_t;
+typedef long blksize_t;
+typedef long __blkcnt32_t;
+typedef long long __blkcnt64_t;
+typedef __blkcnt64_t blkcnt_t;
+typedef unsigned long fsblkcnt_t;
+typedef unsigned long fsfilcnt_t;
+typedef unsigned short __uid16_t;
+typedef unsigned long __uid32_t;
+typedef __uid32_t uid_t;
+typedef unsigned short __gid16_t;
+typedef unsigned long __gid32_t;
+typedef __gid32_t gid_t;
+typedef unsigned long __ino32_t;
+typedef unsigned long long __ino64_t;
+typedef __ino64_t ino_t;
+typedef unsigned long id_t;
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+typedef long long key_t;
+typedef unsigned long vm_offset_t;
+typedef unsigned long vm_size_t;
+typedef void *vm_object_t;
+typedef unsigned char u_int8_t;
+typedef __uint16_t u_int16_t;
+typedef __uint32_t u_int32_t;
+typedef __uint64_t u_int64_t;
+typedef __int32_t register_t;
+typedef char *addr_t;
+typedef unsigned mode_t;
+typedef struct __pthread_t {char __dummy;} *pthread_t;
+typedef struct __pthread_mutex_t {char __dummy;} *pthread_mutex_t;
+typedef struct __pthread_key_t {char __dummy;} *pthread_key_t;
+typedef struct __pthread_attr_t {char __dummy;} *pthread_attr_t;
+typedef struct __pthread_mutexattr_t {char __dummy;} *pthread_mutexattr_t;
+typedef struct __pthread_condattr_t {char __dummy;} *pthread_condattr_t;
+typedef struct __pthread_cond_t {char __dummy;} *pthread_cond_t;
+typedef struct
+{
+ pthread_mutex_t mutex;
+ int state;
+}
+pthread_once_t;
+typedef struct __pthread_rwlock_t {char __dummy;} *pthread_rwlock_t;
+typedef struct __pthread_rwlockattr_t {char __dummy;} *pthread_rwlockattr_t;
+}
+extern char **environ;
+void __attribute__((__cdecl__)) _exit (int __status ) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) access (const char *__path, int __amode );
+unsigned __attribute__((__cdecl__)) alarm (unsigned __secs );
+int __attribute__((__cdecl__)) chdir (const char *__path );
+int __attribute__((__cdecl__)) chmod (const char *__path, mode_t __mode );
+int __attribute__((__cdecl__)) chown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) chroot (const char *__path );
+int __attribute__((__cdecl__)) close (int __fildes );
+size_t __attribute__((__cdecl__)) confstr (int __name, char *__buf, size_t __len);
+char * __attribute__((__cdecl__)) ctermid (char *__s );
+char * __attribute__((__cdecl__)) cuserid (char *__s );
+int __attribute__((__cdecl__)) daemon (int nochdir, int noclose);
+int __attribute__((__cdecl__)) dup (int __fildes );
+int __attribute__((__cdecl__)) dup2 (int __fildes, int __fildes2 );
+int __attribute__((__cdecl__)) dup3 (int __fildes, int __fildes2, int flags);
+int __attribute__((__cdecl__)) eaccess (const char *__path, int __mode);
+void __attribute__((__cdecl__)) endusershell (void);
+int __attribute__((__cdecl__)) euidaccess (const char *__path, int __mode);
+int __attribute__((__cdecl__)) execl (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execle (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execlp (const char *__file, const char *, ... );
+int __attribute__((__cdecl__)) execv (const char *__path, char * const __argv[] );
+int __attribute__((__cdecl__)) execve (const char *__path, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) execvp (const char *__file, char * const __argv[] );
+int __attribute__((__cdecl__)) execvpe (const char *__file, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) faccessat (int __dirfd, const char *__path, int __mode, int __flags);
+int __attribute__((__cdecl__)) fchdir (int __fildes);
+int __attribute__((__cdecl__)) fchmod (int __fildes, mode_t __mode );
+int __attribute__((__cdecl__)) fchown (int __fildes, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) fchownat (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags);
+int __attribute__((__cdecl__)) fexecve (int __fd, char * const __argv[], char * const __envp[] );
+pid_t __attribute__((__cdecl__)) fork (void );
+long __attribute__((__cdecl__)) fpathconf (int __fd, int __name );
+int __attribute__((__cdecl__)) fsync (int __fd);
+int __attribute__((__cdecl__)) fdatasync (int __fd);
+char * __attribute__((__cdecl__)) getcwd (char *__buf, size_t __size );
+int __attribute__((__cdecl__)) getdomainname (char *__name, size_t __len);
+gid_t __attribute__((__cdecl__)) getegid (void );
+uid_t __attribute__((__cdecl__)) geteuid (void );
+gid_t __attribute__((__cdecl__)) getgid (void );
+int __attribute__((__cdecl__)) getgroups (int __gidsetsize, gid_t __grouplist[] );
+long __attribute__((__cdecl__)) gethostid (void);
+char * __attribute__((__cdecl__)) getlogin (void );
+int __attribute__((__cdecl__)) getlogin_r (char *name, size_t namesize);
+char * __attribute__((__cdecl__)) getpass (const char *__prompt);
+int __attribute__((__cdecl__)) getpagesize (void);
+int __attribute__((__cdecl__)) getpeereid (int, uid_t *, gid_t *);
+pid_t __attribute__((__cdecl__)) getpgid (pid_t);
+pid_t __attribute__((__cdecl__)) getpgrp (void );
+pid_t __attribute__((__cdecl__)) getpid (void );
+pid_t __attribute__((__cdecl__)) getppid (void );
+pid_t __attribute__((__cdecl__)) getsid (pid_t);
+uid_t __attribute__((__cdecl__)) getuid (void );
+char * __attribute__((__cdecl__)) getusershell (void);
+char * __attribute__((__cdecl__)) getwd (char *__buf );
+int __attribute__((__cdecl__)) iruserok (unsigned long raddr, int superuser, const char *ruser, const char *luser);
+int __attribute__((__cdecl__)) isatty (int __fildes );
+int __attribute__((__cdecl__)) lchown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) link (const char *__path1, const char *__path2 );
+int __attribute__((__cdecl__)) linkat (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags );
+int __attribute__((__cdecl__)) nice (int __nice_value );
+off_t __attribute__((__cdecl__)) lseek (int __fildes, off_t __offset, int __whence );
+int __attribute__((__cdecl__)) lockf (int __fd, int __cmd, off_t __len);
+long __attribute__((__cdecl__)) pathconf (const char *__path, int __name );
+int __attribute__((__cdecl__)) pause (void );
+int __attribute__((__cdecl__)) pthread_atfork (void (*)(void), void (*)(void), void (*)(void));
+int __attribute__((__cdecl__)) pipe (int __fildes[2] );
+int __attribute__((__cdecl__)) pipe2 (int __fildes[2], int flags);
+ssize_t __attribute__((__cdecl__)) pread (int __fd, void *__buf, size_t __nbytes, off_t __offset);
+ssize_t __attribute__((__cdecl__)) pwrite (int __fd, const void *__buf, size_t __nbytes, off_t __offset);
+_ssize_t __attribute__((__cdecl__)) read (int __fd, void *__buf, size_t __nbyte );
+int __attribute__((__cdecl__)) rresvport (int *__alport);
+int __attribute__((__cdecl__)) revoke (char *__path);
+int __attribute__((__cdecl__)) rmdir (const char *__path );
+int __attribute__((__cdecl__)) ruserok (const char *rhost, int superuser, const char *ruser, const char *luser);
+void * __attribute__((__cdecl__)) sbrk (ptrdiff_t __incr);
+int __attribute__((__cdecl__)) setegid (gid_t __gid );
+int __attribute__((__cdecl__)) seteuid (uid_t __uid );
+int __attribute__((__cdecl__)) setgid (gid_t __gid );
+int __attribute__((__cdecl__)) setgroups (int ngroups, const gid_t *grouplist );
+int __attribute__((__cdecl__)) setpgid (pid_t __pid, pid_t __pgid );
+int __attribute__((__cdecl__)) setpgrp (void );
+int __attribute__((__cdecl__)) setregid (gid_t __rgid, gid_t __egid);
+int __attribute__((__cdecl__)) setreuid (uid_t __ruid, uid_t __euid);
+pid_t __attribute__((__cdecl__)) setsid (void );
+int __attribute__((__cdecl__)) setuid (uid_t __uid );
+void __attribute__((__cdecl__)) setusershell (void);
+unsigned __attribute__((__cdecl__)) sleep (unsigned int __seconds );
+void __attribute__((__cdecl__)) swab (const void *, void *, ssize_t);
+long __attribute__((__cdecl__)) sysconf (int __name );
+pid_t __attribute__((__cdecl__)) tcgetpgrp (int __fildes );
+int __attribute__((__cdecl__)) tcsetpgrp (int __fildes, pid_t __pgrp_id );
+char * __attribute__((__cdecl__)) ttyname (int __fildes );
+int __attribute__((__cdecl__)) ttyname_r (int, char *, size_t);
+int __attribute__((__cdecl__)) unlink (const char *__path );
+int __attribute__((__cdecl__)) usleep (useconds_t __useconds);
+int __attribute__((__cdecl__)) vhangup (void );
+_ssize_t __attribute__((__cdecl__)) write (int __fd, const void *__buf, size_t __nbyte );
+extern "C" {
+extern int __attribute__((dllimport)) opterr;
+extern int __attribute__((dllimport)) optind;
+extern int __attribute__((dllimport)) optopt;
+extern int __attribute__((dllimport)) optreset;
+extern char __attribute__((dllimport)) *optarg;
+int getopt (int, char * const *, const char *);
+}
+pid_t __attribute__((__cdecl__)) vfork (void );
+int __attribute__((__cdecl__)) ftruncate (int __fd, off_t __length);
+int __attribute__((__cdecl__)) truncate (const char *, off_t __length);
+int __attribute__((__cdecl__)) getdtablesize (void);
+int __attribute__((__cdecl__)) setdtablesize (int);
+useconds_t __attribute__((__cdecl__)) ualarm (useconds_t __useconds, useconds_t __interval);
+ int __attribute__((__cdecl__)) gethostname (char *__name, size_t __len);
+char * __attribute__((__cdecl__)) mktemp (char *);
+void __attribute__((__cdecl__)) sync (void);
+ssize_t __attribute__((__cdecl__)) readlink (const char *__path, char *__buf, size_t __buflen);
+ssize_t __attribute__((__cdecl__)) readlinkat (int __dirfd1, const char *__path, char *__buf, size_t __buflen);
+int __attribute__((__cdecl__)) symlink (const char *__name1, const char *__name2);
+int __attribute__((__cdecl__)) symlinkat (const char *, int, const char *);
+int __attribute__((__cdecl__)) unlinkat (int, const char *, int);
+}
+
+namespace boost{
+ __extension__ typedef long long long_long_type;
+ __extension__ typedef unsigned long long ulong_long_type;
+}
+namespace mpl_ { namespace aux {} }
+namespace boost { namespace mpl { using namespace mpl_;
+namespace aux { using namespace mpl_::aux; }
+}}
+namespace mpl_ {
+template< int N > struct int_;
+}
+namespace boost { namespace mpl { using ::mpl_::int_; } }
+namespace mpl_ {
+struct integral_c_tag { static const int value = 0; };
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c_tag; } }
+namespace mpl_ {
+template< int N >
+struct int_
+{
+ static const int value = N;
+ typedef int_ type;
+ typedef int value_type;
+ typedef integral_c_tag tag;
+ typedef mpl_::int_< static_cast<int>((value + 1)) > next;
+ typedef mpl_::int_< static_cast<int>((value - 1)) > prior;
+ operator int() const { return static_cast<int>(this->value); }
+};
+template< int N >
+int const mpl_::int_< N >::value;
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename F > struct template_arity;
+}}}
+namespace mpl_ {
+template< bool C_ > struct bool_;
+typedef bool_<true> true_;
+typedef bool_<false> false_;
+}
+namespace boost { namespace mpl { using ::mpl_::bool_; } }
+namespace boost { namespace mpl { using ::mpl_::true_; } }
+namespace boost { namespace mpl { using ::mpl_::false_; } }
+namespace mpl_ {
+template< bool C_ > struct bool_
+{
+ static const bool value = C_;
+ typedef integral_c_tag tag;
+ typedef bool_ type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+template< bool C_ >
+bool const bool_<C_>::value;
+}
+namespace mpl_ {
+template< typename T, T N > struct integral_c;
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c; } }
+namespace mpl_ {
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+ typedef integral_c type;
+ typedef T value_type;
+ typedef integral_c_tag tag;
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+ typedef integral_c< T, static_cast<T>((value - 1)) > prior;
+ operator T() const { return static_cast<T>(this->value); }
+};
+template< typename T, T N >
+T const integral_c< T, N >::value;
+}
+namespace mpl_ {
+template< bool C >
+struct integral_c<bool, C>
+{
+ static const bool value = C;
+ typedef integral_c_tag tag;
+ typedef integral_c type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+}
+namespace boost{
+template <class T, T val>
+struct integral_constant : public mpl::integral_c<T, val>
+{
+ typedef integral_constant<T,val> type;
+};
+template<> struct integral_constant<bool,true> : public mpl::true_
+{
+ typedef integral_constant<bool,true> type;
+};
+template<> struct integral_constant<bool,false> : public mpl::false_
+{
+ typedef integral_constant<bool,false> type;
+};
+typedef integral_constant<bool,true> true_type;
+typedef integral_constant<bool,false> false_type;
+}
+namespace boost {
+template< typename T > struct is_lvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_lvalue_reference< T& > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_rvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+namespace type_traits {
+typedef char yes_type;
+struct no_type
+{
+ char padding[8];
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
+struct ice_or;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_or
+{
+ static const bool value = true;
+};
+template <>
+struct ice_or<false, false, false, false, false, false, false>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
+struct ice_and;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_and
+{
+ static const bool value = false;
+};
+template <>
+struct ice_and<true, true, true, true, true, true, true>
+{
+ static const bool value = true;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b>
+struct ice_not
+{
+ static const bool value = true;
+};
+template <>
+struct ice_not<true>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <int b1, int b2>
+struct ice_eq
+{
+ static const bool value = (b1 == b2);
+};
+template <int b1, int b2>
+struct ice_ne
+{
+ static const bool value = (b1 != b2);
+};
+template <int b1, int b2> bool const ice_eq<b1,b2>::value;
+template <int b1, int b2> bool const ice_ne<b1,b2>::value;
+}
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct is_reference_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value >::value);
+};
+}
+template< typename T > struct is_reference : public ::boost::integral_constant<bool,::boost::detail::is_reference_impl<T>::value> { public: };
+}
+namespace boost {
+namespace type_traits {
+struct false_result
+{
+ template <typename T> struct result_
+ {
+ static const bool value = false;
+ };
+};
+}}
+namespace boost {
+namespace type_traits {
+template <class R>
+struct is_function_ptr_helper
+{
+ static const bool value = false;
+};
+template <class R >
+struct is_function_ptr_helper<R (*)()> { static const bool value = true; };
+template <class R >
+struct is_function_ptr_helper<R (*)( ...)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)> { static const bool value = true; };
+}
+}
+namespace boost {
+namespace detail {
+template<bool is_ref = true>
+struct is_function_chooser
+ : public ::boost::type_traits::false_result
+{
+};
+template <>
+struct is_function_chooser<false>
+{
+ template< typename T > struct result_
+ : public ::boost::type_traits::is_function_ptr_helper<T*>
+ {
+ };
+};
+template <typename T>
+struct is_function_impl
+ : public is_function_chooser< ::boost::is_reference<T>::value >
+ ::template result_<T>
+{
+};
+}
+template< typename T > struct is_function : public ::boost::integral_constant<bool,::boost::detail::is_function_impl<T>::value> { public: };
+}
+namespace boost
+{
+ template <bool B, class T = void>
+ struct enable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct enable_if_c<false, T> {};
+ template <class Cond, class T = void>
+ struct enable_if : public enable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_enable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_enable_if_c<false, T> {};
+ template <class Cond, class T>
+ struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+ template <bool B, class T = void>
+ struct disable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct disable_if_c<true, T> {};
+ template <class Cond, class T = void>
+ struct disable_if : public disable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_disable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_disable_if_c<true, T> {};
+ template <class Cond, class T>
+ struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+}
+namespace boost { namespace type_of {
+ template<typename T>
+ typename enable_if<is_function<T>, T&>::type
+ ensure_obj(T&);
+ template<typename T>
+ typename disable_if<is_function<T>, T&>::type
+ ensure_obj(const T&);
+}}
+namespace boost { namespace scope_exit { namespace aux {
+ template<int Dummy = 0>
+ struct declared
+ {
+ void* value;
+ static int const cmp2 = 0;
+ friend void operator>(int, declared const&) {}
+ };
+ struct undeclared { declared<> dummy[2]; };
+ template<int> struct resolve;
+ template<>
+ struct resolve<sizeof(declared<>)>
+ {
+ static const int cmp1 = 0;
+ };
+ template<>
+ struct resolve<sizeof(undeclared)>
+ {
+ template<int>
+ struct cmp1
+ {
+ static int const cmp2 = 0;
+ };
+ };
+} } }
+extern boost::scope_exit::aux::undeclared boost_scope_exit_args;
+namespace boost { namespace scope_exit { namespace aux {
+typedef void (*ref_tag)(int&);
+typedef void (*val_tag)(int );
+template<class T, class Tag> struct member;
+template<class T>
+struct member<T,ref_tag>
+{
+ T& value;
+};
+template<class T>
+struct member<T,val_tag>
+{
+ T value;
+};
+template<class T> inline T& deref(T* p, ref_tag) { return *p; }
+template<class T> inline T& deref(T& r, val_tag) { return r; }
+template<class T>
+struct wrapper
+{
+ typedef T type;
+};
+template<class T> wrapper<T> wrap(T&);
+} } }
+
+namespace boost {
+template< typename T > struct remove_pointer { public: typedef T type; };
+template< typename T > struct remove_pointer<T*> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* volatile> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const volatile> { public: typedef T type; };
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace detail{
+template <class T>
+struct remove_rvalue_ref
+{
+ typedef T type;
+};
+}
+template< typename T > struct remove_reference { public: typedef typename boost::detail::remove_rvalue_ref<T>::type type; };
+template< typename T > struct remove_reference<T&> { public: typedef T type; };
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct add_pointer_impl
+{
+ typedef typename remove_reference<T>::type no_ref_type;
+ typedef no_ref_type* type;
+};
+}
+template< typename T > struct add_pointer { public: typedef typename boost::detail::add_pointer_impl<T>::type type; };
+}
+namespace boost {
+namespace detail {
+template<typename Function> struct function_traits_helper;
+template<typename R>
+struct function_traits_helper<R (*)(void)>
+{
+ static const unsigned arity = 0;
+ typedef R result_type;
+};
+template<typename R, typename T1>
+struct function_traits_helper<R (*)(T1)>
+{
+ static const unsigned arity = 1;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T1 argument_type;
+};
+template<typename R, typename T1, typename T2>
+struct function_traits_helper<R (*)(T1, T2)>
+{
+ static const unsigned arity = 2;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T1 first_argument_type;
+ typedef T2 second_argument_type;
+};
+template<typename R, typename T1, typename T2, typename T3>
+struct function_traits_helper<R (*)(T1, T2, T3)>
+{
+ static const unsigned arity = 3;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4>
+struct function_traits_helper<R (*)(T1, T2, T3, T4)>
+{
+ static const unsigned arity = 4;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
+{
+ static const unsigned arity = 5;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
+{
+ static const unsigned arity = 6;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
+{
+ static const unsigned arity = 7;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
+{
+ static const unsigned arity = 8;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
+{
+ static const unsigned arity = 9;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9,
+ typename T10>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
+{
+ static const unsigned arity = 10;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+ typedef T10 arg10_type;
+};
+}
+template<typename Function>
+struct function_traits :
+ public boost::detail::function_traits_helper<typename boost::add_pointer<Function>::type>
+{
+};
+}
+
+namespace boost {
+template< typename T > struct is_integral : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_integral< unsigned char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< bool > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< wchar_t > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::ulong_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::long_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_float : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_float< float > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< long double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T >
+struct is_arithmetic_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_float<T>::value >::value);
+};
+}
+template< typename T > struct is_arithmetic : public ::boost::integral_constant<bool,::boost::detail::is_arithmetic_impl<T>::value> { public: };
+}
+namespace boost {
+template< typename T, typename U > struct is_same : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_same< T,T > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template <typename T> struct cv_traits_imp {};
+template <typename T>
+struct cv_traits_imp<T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<volatile T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const volatile T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+}
+}
+namespace boost {
+namespace detail{
+template <class T>
+struct is_volatile_rval_filter
+{
+ static const bool value = ::boost::detail::cv_traits_imp<T*>::is_volatile;
+};
+}
+template< typename T > struct is_volatile : public ::boost::integral_constant<bool,::boost::detail::is_volatile_rval_filter<T>::value> { public: };
+template< typename T > struct is_volatile< T& > : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+template< typename T > struct is_enum : public ::boost::integral_constant<bool,__is_enum(T)> { public: };
+}
+namespace boost {
+namespace type_traits {
+template <typename T>
+struct is_mem_fun_pointer_impl
+{
+ static const bool value = false;
+};
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile > { static const bool value = true; };
+}
+}
+
+namespace boost {
+namespace detail{
+template <class T>
+struct rvalue_ref_filter_rem_cv
+{
+ typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
+};
+}
+template< typename T > struct remove_cv { public: typedef typename boost::detail::rvalue_ref_filter_rem_cv<T>::type type; };
+template< typename T > struct remove_cv<T&> { public: typedef T& type; };
+template< typename T, std::size_t N > struct remove_cv<T const[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T volatile[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T const volatile[N]> { public: typedef T type[N]; };
+}
+namespace boost {
+template< typename T > struct is_member_function_pointer : public ::boost::integral_constant<bool,::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value> { public: };
+}
+namespace boost {
+template< typename T > struct is_member_pointer : public ::boost::integral_constant<bool,::boost::is_member_function_pointer<T>::value> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::* > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*volatile > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T > struct is_pointer_helper
+{
+ static const bool value = false;
+};
+template< typename T > struct is_pointer_helper<T*> { static const bool value = true; };
+template< typename T >
+struct is_pointer_impl
+{
+ static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value);
+};
+}
+template< typename T > struct is_pointer : public ::boost::integral_constant<bool,::boost::detail::is_pointer_impl<T>::value> { public: };
+}
+namespace boost{
+namespace detail{
+template <typename T, bool small_>
+struct ct_imp2
+{
+ typedef const T& param_type;
+};
+template <typename T>
+struct ct_imp2<T, true>
+{
+ typedef const T param_type;
+};
+template <typename T, bool isp, bool b1, bool b2>
+struct ct_imp
+{
+ typedef const T& param_type;
+};
+template <typename T, bool isp, bool b2>
+struct ct_imp<T, isp, true, b2>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool isp, bool b1>
+struct ct_imp<T, isp, b1, true>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool b1, bool b2>
+struct ct_imp<T, true, b1, b2>
+{
+ typedef const T param_type;
+};
+}
+template <typename T>
+struct call_traits
+{
+public:
+ typedef T value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef typename boost::detail::ct_imp<
+ T,
+ ::boost::is_pointer<T>::value,
+ ::boost::is_arithmetic<T>::value,
+ ::boost::is_enum<T>::value
+ >::param_type param_type;
+};
+template <typename T>
+struct call_traits<T&>
+{
+ typedef T& value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T& param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<T [N]>
+{
+private:
+ typedef T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<const T [N]>
+{
+private:
+ typedef const T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+}
+namespace boost { namespace local { namespace aux {
+template<typename F, size_t defaults = 0>
+class function {
+};
+template<
+ typename R
+
+
+>
+class function<
+ R ()
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()() const { return call0_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr1)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); } inline R operator()() const { return call1_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr2)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); } inline R operator()() const { return call2_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr3)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); } inline R operator()() const { return call3_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr4)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); } inline R operator()() const { return call4_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 5
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr5)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4 , call_ptr5 call5
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4; call5_ = call5;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); } inline R operator()() const { return call5_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_; call_ptr5 call5_;
+ void* unused_;
+};
+}}}
+namespace boost { namespace local { namespace aux {
+template<typename T> struct add_pointed_const { typedef T type; };
+template<typename T> struct add_pointed_const<T*> { typedef T const* type; };
+template<typename T> struct add_pointed_const<T const*>
+ { typedef T const* type; };
+template<typename T> struct add_pointed_const<T* const>
+ { typedef T const* const type; };
+template<typename T> struct add_pointed_const<T const* const>
+ { typedef T const* const type; };
+}}}
+namespace boost {
+template< typename T > struct add_const { public: typedef T const type; };
+template< typename T > struct add_const<T&> { public: typedef T& type; };
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct nested_type_wknd
+ : T::type
+{
+};
+}}}
+namespace mpl_ {
+struct void_;
+}
+namespace boost { namespace mpl { using ::mpl_::void_; } }
+namespace mpl_ {
+struct na
+{
+ typedef na type;
+ enum { value = 0 };
+};
+}
+namespace boost { namespace mpl { using ::mpl_::na; } }
+namespace boost { namespace mpl {
+template< typename T >
+struct is_na
+ : false_
+{
+};
+template<>
+struct is_na<na>
+ : true_
+{
+};
+template< typename T >
+struct is_not_na
+ : true_
+{
+};
+template<>
+struct is_not_na<na>
+ : false_
+{
+};
+template< typename T, typename U > struct if_na
+{
+ typedef T type;
+};
+template< typename U > struct if_na<na,U>
+{
+ typedef U type;
+};
+}}
+namespace boost { namespace mpl {
+template<
+ typename T = na
+ , typename Tag = void_
+ , typename Arity = int_< aux::template_arity<T>::value >
+ >
+struct lambda;
+}}
+namespace boost { namespace mpl {
+namespace aux {
+template< long C_ >
+struct not_impl
+ : bool_<!C_>
+{
+};
+}
+template<
+ typename T = na
+ >
+struct not_
+ : aux::not_impl<
+ ::boost::mpl::aux::nested_type_wknd<T>::value
+ >
+{
+
+};
+template<> struct not_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : not_< T1 > { }; }; template< typename Tag > struct lambda< not_< na > , Tag , int_<-1> > { typedef false_ is_le; typedef not_< na > result_; typedef not_< na > type; }; namespace aux { template< typename T1 > struct template_arity< not_< T1 > > : int_<1> { }; template<> struct template_arity< not_< na > > : int_<-1> { }; }
+}}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct value_type_wknd
+{
+ typedef typename T::value_type type;
+};
+}}}
+namespace boost { namespace mpl { namespace aux {
+typedef char (&no_tag)[1];
+typedef char (&yes_tag)[2];
+template< bool C_ > struct yes_no_tag
+{
+ typedef no_tag type;
+};
+template<> struct yes_no_tag<true>
+{
+ typedef yes_tag type;
+};
+template< long n > struct weighted_tag
+{
+ typedef char (&type)[n];
+};
+}}}
+
+namespace mpl_ {
+struct failed {};
+template< bool C > struct assert { typedef void* type; };
+template<> struct assert<false> { typedef assert type; };
+template< bool C >
+int assertion_failed( typename assert<C>::type );
+template< bool C >
+struct assertion
+{
+ static int failed( assert<false> );
+};
+template<>
+struct assertion<true>
+{
+ static int failed( void* );
+};
+struct assert_
+{
+ template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};
+ static assert_ const arg;
+ enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };
+};
+boost::mpl::aux::weighted_tag<1>::type operator==( assert_, assert_ );
+boost::mpl::aux::weighted_tag<2>::type operator!=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<3>::type operator>( assert_, assert_ );
+boost::mpl::aux::weighted_tag<4>::type operator>=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<5>::type operator<( assert_, assert_ );
+boost::mpl::aux::weighted_tag<6>::type operator<=( assert_, assert_ );
+template< assert_::relations r, long x, long y > struct assert_relation {};
+template< bool > struct assert_arg_pred_impl { typedef int type; };
+template<> struct assert_arg_pred_impl<true> { typedef void* type; };
+template< typename P > struct assert_arg_pred
+{
+ typedef typename P::type p_type;
+ typedef typename assert_arg_pred_impl< p_type::value >::type type;
+};
+template< typename P > struct assert_arg_pred_not
+{
+ typedef typename P::type p_type;
+ enum { p = !p_type::value };
+ typedef typename assert_arg_pred_impl<p>::type type;
+};
+template< typename Pred >
+failed ************ (Pred::************
+ assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )
+ );
+template< typename Pred >
+failed ************ (boost::mpl::not_<Pred>::************
+ assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )
+ );
+template< typename Pred >
+assert<false>
+assert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );
+template< typename Pred >
+assert<false>
+assert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );
+}
+extern boost::scope_exit::aux::undeclared boost_closure_auxXargsX;
+
+
+namespace std {
+ void
+ __throw_bad_exception(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_cast(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_typeid(void) __attribute__((__noreturn__));
+ void
+ __throw_logic_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_domain_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_invalid_argument(const char*) __attribute__((__noreturn__));
+ void
+ __throw_length_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_out_of_range(const char*) __attribute__((__noreturn__));
+ void
+ __throw_runtime_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_range_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_overflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_underflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_ios_failure(const char*) __attribute__((__noreturn__));
+ void
+ __throw_system_error(int) __attribute__((__noreturn__));
+ void
+ __throw_future_error(int) __attribute__((__noreturn__));
+ void
+ __throw_bad_function_call() __attribute__((__noreturn__));
+}
+
+namespace __gnu_cxx {
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+}
+namespace std {
+ struct __true_type { };
+ struct __false_type { };
+ template<bool>
+ struct __truth_type
+ { typedef __false_type __type; };
+ template<>
+ struct __truth_type<true>
+ { typedef __true_type __type; };
+ template<class _Sp, class _Tp>
+ struct __traitor
+ {
+ enum { __value = bool(_Sp::__value) || bool(_Tp::__value) };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+ template<typename, typename>
+ struct __are_same
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __are_same<_Tp, _Tp>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_void
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_void<void>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_integer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_integer<bool>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_floating
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_floating<float>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<long double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer<_Tp*>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_normal_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Iterator, typename _Container>
+ struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator,
+ _Container> >
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_arithmetic
+ : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_fundamental
+ : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_scalar
+ : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_char
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_char<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_char<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_byte
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_byte<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_move_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ class __is_iterator_helper
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+ template<typename _Up>
+ struct _Wrap_type
+ { };
+ template<typename _Up>
+ static __one __test(_Wrap_type<typename _Up::iterator_category>*);
+ template<typename _Up>
+ static __two __test(...);
+ public:
+ static const bool __value = (sizeof(__test<_Tp>(0)) == 1
+ || __is_pointer<_Tp>::__value);
+ };
+ template<typename _Tp>
+ struct __is_iterator
+ {
+ enum { __value = __is_iterator_helper<_Tp>::__value };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<bool, typename>
+ struct __enable_if
+ { };
+ template<typename _Tp>
+ struct __enable_if<true, _Tp>
+ { typedef _Tp __type; };
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct __conditional_type
+ { typedef _Iftrue __type; };
+ template<typename _Iftrue, typename _Iffalse>
+ struct __conditional_type<false, _Iftrue, _Iffalse>
+ { typedef _Iffalse __type; };
+ template<typename _Tp>
+ struct __add_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __add_unsigned<char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<signed char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<short>
+ { typedef unsigned short __type; };
+ template<>
+ struct __add_unsigned<int>
+ { typedef unsigned int __type; };
+ template<>
+ struct __add_unsigned<long>
+ { typedef unsigned long __type; };
+ template<>
+ struct __add_unsigned<long long>
+ { typedef unsigned long long __type; };
+ template<>
+ struct __add_unsigned<bool>;
+ template<>
+ struct __add_unsigned<wchar_t>;
+ template<typename _Tp>
+ struct __remove_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __remove_unsigned<char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned short>
+ { typedef short __type; };
+ template<>
+ struct __remove_unsigned<unsigned int>
+ { typedef int __type; };
+ template<>
+ struct __remove_unsigned<unsigned long>
+ { typedef long __type; };
+ template<>
+ struct __remove_unsigned<unsigned long long>
+ { typedef long long __type; };
+ template<>
+ struct __remove_unsigned<bool>;
+ template<>
+ struct __remove_unsigned<wchar_t>;
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type* __ptr)
+ { return __ptr == 0; }
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type)
+ { return false; }
+ template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
+ struct __promote
+ { typedef double __type; };
+ template<typename _Tp>
+ struct __promote<_Tp, false>
+ { typedef _Tp __type; };
+ template<typename _Tp, typename _Up>
+ struct __promote_2
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ public:
+ typedef __typeof__(__type1() + __type2()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp>
+ struct __promote_3
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp, typename _Wp>
+ struct __promote_4
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ typedef typename __promote<_Wp>::__type __type4;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3() + __type4()) __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<typename _Value>
+ struct __numeric_traits_integer
+ {
+ static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0);
+ static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0);
+ static const bool __is_signed = ((_Value)(-1) < 0);
+ static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0));
+ };
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__min;
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__max;
+ template<typename _Value>
+ const bool __numeric_traits_integer<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_integer<_Value>::__digits;
+ template<typename _Value>
+ struct __numeric_traits_floating
+ {
+ static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 3010 / 10000);
+ static const bool __is_signed = true;
+ static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18);
+ static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932);
+ };
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_digits10;
+ template<typename _Value>
+ const bool __numeric_traits_floating<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__digits10;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_exponent10;
+ template<typename _Value>
+ struct __numeric_traits
+ : public __conditional_type<std::__is_integer<_Value>::__value,
+ __numeric_traits_integer<_Value>,
+ __numeric_traits_floating<_Value> >::__type
+ { };
+}
+
+
+namespace std {
+ struct input_iterator_tag { };
+ struct output_iterator_tag { };
+ struct forward_iterator_tag : public input_iterator_tag { };
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<const _Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ };
+ template<typename _Iter>
+ inline typename iterator_traits<_Iter>::iterator_category
+ __iterator_category(const _Iter&)
+ { return typename iterator_traits<_Iter>::iterator_category(); }
+}
+
+namespace std {
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ __distance(_InputIterator __first, _InputIterator __last,
+ input_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ while (__first != __last)
+ {
+ ++__first;
+ ++__n;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator>
+ inline typename iterator_traits<_RandomAccessIterator>::difference_type
+ __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ return __last - __first;
+ }
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ distance(_InputIterator __first, _InputIterator __last)
+ {
+ return std::__distance(__first, __last,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
+ {
+
+ while (__n--)
+ ++__i;
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ inline void
+ __advance(_BidirectionalIterator& __i, _Distance __n,
+ bidirectional_iterator_tag)
+ {
+
+ if (__n > 0)
+ while (__n--)
+ ++__i;
+ else
+ while (__n++)
+ --__i;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline void
+ __advance(_RandomAccessIterator& __i, _Distance __n,
+ random_access_iterator_tag)
+ {
+
+ __i += __n;
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ advance(_InputIterator& __i, _Distance __n)
+ {
+ typename iterator_traits<_InputIterator>::difference_type __d = __n;
+ std::__advance(__i, __d, std::__iterator_category(__i));
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::pointer pointer;
+ typedef typename __traits_type::reference reference;
+ reverse_iterator() : current() { }
+ explicit
+ reverse_iterator(iterator_type __x) : current(__x) { }
+ reverse_iterator(const reverse_iterator& __x)
+ : current(__x.current) { }
+ template<typename _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x)
+ : current(__x.base()) { }
+ iterator_type
+ base() const
+ { return current; }
+ reference
+ operator*() const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer
+ operator->() const
+ { return &(operator*()); }
+ reverse_iterator&
+ operator++()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator
+ operator++(int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator&
+ operator--()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator
+ operator--(int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator
+ operator+(difference_type __n) const
+ { return reverse_iterator(current - __n); }
+ reverse_iterator&
+ operator+=(difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator
+ operator-(difference_type __n) const
+ { return reverse_iterator(current + __n); }
+ reverse_iterator&
+ operator-=(difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference
+ operator[](difference_type __n) const
+ { return *(*this + __n); }
+ };
+ template<typename _Iterator>
+ inline bool
+ operator==(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator<(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator!=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x == __y); }
+ template<typename _Iterator>
+ inline bool
+ operator>(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y < __x; }
+ template<typename _Iterator>
+ inline bool
+ operator<=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__y < __x); }
+ template<typename _Iterator>
+ inline bool
+ operator>=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x < __y); }
+ template<typename _Iterator>
+ inline typename reverse_iterator<_Iterator>::difference_type
+ operator-(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Iterator>
+ inline reverse_iterator<_Iterator>
+ operator+(typename reverse_iterator<_Iterator>::difference_type __n,
+ const reverse_iterator<_Iterator>& __x)
+ { return reverse_iterator<_Iterator>(__x.base() - __n); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator==(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator!=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x == __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y < __x; }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__y < __x); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x < __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline typename reverse_iterator<_IteratorL>::difference_type
+ operator-(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Container>
+ class back_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit
+ back_insert_iterator(_Container& __x) : container(&__x) { }
+ back_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_back(__value);
+ return *this;
+ }
+ back_insert_iterator&
+ operator*()
+ { return *this; }
+ back_insert_iterator&
+ operator++()
+ { return *this; }
+ back_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline back_insert_iterator<_Container>
+ back_inserter(_Container& __x)
+ { return back_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class front_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit front_insert_iterator(_Container& __x) : container(&__x) { }
+ front_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_front(__value);
+ return *this;
+ }
+ front_insert_iterator&
+ operator*()
+ { return *this; }
+ front_insert_iterator&
+ operator++()
+ { return *this; }
+ front_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline front_insert_iterator<_Container>
+ front_inserter(_Container& __x)
+ { return front_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ typename _Container::iterator iter;
+ public:
+ typedef _Container container_type;
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x), iter(__i) {}
+ insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ iter = container->insert(iter, __value);
+ ++iter;
+ return *this;
+ }
+ insert_iterator&
+ operator*()
+ { return *this; }
+ insert_iterator&
+ operator++()
+ { return *this; }
+ insert_iterator&
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container, typename _Iterator>
+ inline insert_iterator<_Container>
+ inserter(_Container& __x, _Iterator __i)
+ {
+ return insert_iterator<_Container>(__x,
+ typename _Container::iterator(__i));
+ }
+}
+namespace __gnu_cxx {
+ using std::iterator_traits;
+ using std::iterator;
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ protected:
+ _Iterator _M_current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::iterator_category iterator_category;
+ typedef typename __traits_type::value_type value_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::reference reference;
+ typedef typename __traits_type::pointer pointer;
+ __normal_iterator() : _M_current(_Iterator()) { }
+ explicit
+ __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
+ template<typename _Iter>
+ __normal_iterator(const __normal_iterator<_Iter,
+ typename __enable_if<
+ (std::__are_same<_Iter, typename _Container::pointer>::__value),
+ _Container>::__type>& __i)
+ : _M_current(__i.base()) { }
+ reference
+ operator*() const
+ { return *_M_current; }
+ pointer
+ operator->() const
+ { return _M_current; }
+ __normal_iterator&
+ operator++()
+ {
+ ++_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator++(int)
+ { return __normal_iterator(_M_current++); }
+ __normal_iterator&
+ operator--()
+ {
+ --_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator--(int)
+ { return __normal_iterator(_M_current--); }
+ reference
+ operator[](const difference_type& __n) const
+ { return _M_current[__n]; }
+ __normal_iterator&
+ operator+=(const difference_type& __n)
+ { _M_current += __n; return *this; }
+ __normal_iterator
+ operator+(const difference_type& __n) const
+ { return __normal_iterator(_M_current + __n); }
+ __normal_iterator&
+ operator-=(const difference_type& __n)
+ { _M_current -= __n; return *this; }
+ __normal_iterator
+ operator-(const difference_type& __n) const
+ { return __normal_iterator(_M_current - __n); }
+ const _Iterator&
+ base() const
+ { return _M_current; }
+ };
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline typename __normal_iterator<_IteratorL, _Container>::difference_type
+ operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline typename __normal_iterator<_Iterator, _Container>::difference_type
+ operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline __normal_iterator<_Iterator, _Container>
+ operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
+ __n, const __normal_iterator<_Iterator, _Container>& __i)
+ { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
+}
+namespace std
+{
+ namespace __debug { }
+}
+namespace __gnu_debug
+{
+ using namespace std::__debug;
+}
+namespace std {
+ template<bool _BoolType>
+ struct __iter_swap
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ _ValueType1 __tmp = (*__a);
+ *__a = (*__b);
+ *__b = (__tmp);
+ }
+ };
+ template<>
+ struct __iter_swap<true>
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ swap(*__a, *__b);
+ }
+ };
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ typedef typename iterator_traits<_ForwardIterator1>::reference
+ _ReferenceType1;
+ typedef typename iterator_traits<_ForwardIterator2>::reference
+ _ReferenceType2;
+ std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value
+ && __are_same<_ValueType1&, _ReferenceType1>::__value
+ && __are_same<_ValueType2&, _ReferenceType2>::__value>::
+ iter_swap(__a, __b);
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator2
+ swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ std::iter_swap(__first1, __first2);
+ return __first2;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__b < __a)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__a < __b)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__b, __a))
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__a, __b))
+ return __b;
+ return __a;
+ }
+ template<typename _Iterator, bool _HasBase>
+ struct _Iter_base
+ {
+ typedef _Iterator iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it; }
+ };
+ template<typename _Iterator>
+ struct _Iter_base<_Iterator, true>
+ {
+ typedef typename _Iterator::iterator_type iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it.base(); }
+ };
+ template<typename _Iterator>
+ struct _Niter_base
+ : _Iter_base<_Iterator, __is_normal_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Niter_base<_Iterator>::iterator_type
+ __niter_base(_Iterator __it)
+ { return std::_Niter_base<_Iterator>::_S_base(__it); }
+ template<typename _Iterator>
+ struct _Miter_base
+ : _Iter_base<_Iterator, __is_move_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Miter_base<_Iterator>::iterator_type
+ __miter_base(_Iterator __it)
+ { return std::_Miter_base<_Iterator>::_S_base(__it); }
+ template<bool, bool, typename>
+ struct __copy_move
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ for (; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move<false, false, random_access_iterator_tag>
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::difference_type _Distance;
+ for(_Distance __n = __last - __first; __n > 0; --__n)
+ {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
+ return __result + _Num;
+ }
+ };
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::value_type _ValueTypeI;
+ typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
+ typedef typename iterator_traits<_II>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueTypeI)
+ && __is_pointer<_II>::__value
+ && __is_pointer<_OI>::__value
+ && __are_same<_ValueTypeI, _ValueTypeO>::__value);
+ return std::__copy_move<_IsMove, __simple,
+ _Category>::__copy_m(__first, __last, __result);
+ }
+ template<typename _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator;
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(_CharT*, _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(const _CharT*, const _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
+ istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a2(_II __first, _II __last, _OI __result)
+ {
+ return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first),
+ std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _II, typename _OI>
+ inline _OI
+ copy(_II __first, _II __last, _OI __result)
+ {
+
+
+ ;
+ return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<bool, bool, typename>
+ struct __copy_move_backward
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ while (__first != __last)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move_backward<false, false, random_access_iterator_tag>
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typename iterator_traits<_BI1>::difference_type __n;
+ for (__n = __last - __first; __n > 0; --__n)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
+ return __result - _Num;
+ }
+ };
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typedef typename iterator_traits<_BI1>::value_type _ValueType1;
+ typedef typename iterator_traits<_BI2>::value_type _ValueType2;
+ typedef typename iterator_traits<_BI1>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueType1)
+ && __is_pointer<_BI1>::__value
+ && __is_pointer<_BI2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__copy_move_backward<_IsMove, __simple,
+ _Category>::__copy_move_b(__first,
+ __last,
+ __result);
+ }
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ return _BI2(std::__copy_move_backward_a<_IsMove>
+ (std::__niter_base(__first), std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _BI1, typename _BI2>
+ inline _BI2
+ copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+
+
+
+ ;
+ return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ for (; __first != __last; ++__first)
+ *__first = __value;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __first != __last; ++__first)
+ *__first = __tmp;
+ }
+ template<typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
+ __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
+ {
+ const _Tp __tmp = __c;
+ __builtin_memset(__first, static_cast<unsigned char>(__tmp),
+ __last - __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ {
+
+ ;
+ std::__fill_a(std::__niter_base(__first), std::__niter_base(__last),
+ __value);
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ for (; __n > 0; --__n, ++__first)
+ *__first = __value;
+ return __first;
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __n > 0; --__n, ++__first)
+ *__first = __tmp;
+ return __first;
+ }
+ template<typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
+ __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
+ {
+ std::__fill_a(__first, __first + __n, __c);
+ return __first + __n;
+ }
+ template<typename _OI, typename _Size, typename _Tp>
+ inline _OI
+ fill_n(_OI __first, _Size __n, const _Tp& __value)
+ {
+
+ return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
+ }
+ template<bool _BoolType>
+ struct __equal
+ {
+ template<typename _II1, typename _II2>
+ static bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!(*__first1 == *__first2))
+ return false;
+ return true;
+ }
+ };
+ template<>
+ struct __equal<true>
+ {
+ template<typename _Tp>
+ static bool
+ equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
+ {
+ return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
+ * (__last1 - __first1));
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple = (__is_integer<_ValueType1>::__value
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__equal<__simple>::equal(__first1, __last1, __first2);
+ }
+ template<typename, typename>
+ struct __lc_rai
+ {
+ template<typename _II1, typename _II2>
+ static _II1
+ __newlast1(_II1, _II1 __last1, _II2, _II2)
+ { return __last1; }
+ template<typename _II>
+ static bool
+ __cnd2(_II __first, _II __last)
+ { return __first != __last; }
+ };
+ template<>
+ struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
+ {
+ template<typename _RAI1, typename _RAI2>
+ static _RAI1
+ __newlast1(_RAI1 __first1, _RAI1 __last1,
+ _RAI2 __first2, _RAI2 __last2)
+ {
+ const typename iterator_traits<_RAI1>::difference_type
+ __diff1 = __last1 - __first1;
+ const typename iterator_traits<_RAI2>::difference_type
+ __diff2 = __last2 - __first2;
+ return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
+ }
+ template<typename _RAI>
+ static bool
+ __cnd2(_RAI, _RAI)
+ { return true; }
+ };
+ template<bool _BoolType>
+ struct __lexicographical_compare
+ {
+ template<typename _II1, typename _II2>
+ static bool __lc(_II1, _II1, _II2, _II2);
+ };
+ template<bool _BoolType>
+ template<typename _II1, typename _II2>
+ bool
+ __lexicographical_compare<_BoolType>::
+ __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+ __last1 = __rai_type::__newlast1(__first1, __last1,
+ __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (*__first1 < *__first2)
+ return true;
+ if (*__first2 < *__first1)
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<>
+ struct __lexicographical_compare<true>
+ {
+ template<typename _Tp, typename _Up>
+ static bool
+ __lc(const _Tp* __first1, const _Tp* __last1,
+ const _Up* __first2, const _Up* __last2)
+ {
+ const size_t __len1 = __last1 - __first1;
+ const size_t __len2 = __last2 - __first2;
+ const int __result = __builtin_memcmp(__first1, __first2,
+ std::min(__len1, __len2));
+ return __result != 0 ? __result < 0 : __len1 < __len2;
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple =
+ (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value
+ && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed
+ && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value);
+ return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
+ __first2, __last2);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _Size>
+ inline _Size
+ __lg(_Size __n)
+ {
+ _Size __k;
+ for (__k = 0; __n != 0; __n >>= 1)
+ ++__k;
+ return __k - 1;
+ }
+ inline int
+ __lg(int __n)
+ { return sizeof(int) * 8 - 1 - __builtin_clz(__n); }
+ inline long
+ __lg(long __n)
+ { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); }
+ inline long long
+ __lg(long long __n)
+ { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); }
+}
+namespace std {
+ template<typename _II1, typename _II2>
+ inline bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+
+
+
+ ;
+ return std::__equal_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2));
+ }
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ inline bool
+ equal(_IIter1 __first1, _IIter1 __last1,
+ _IIter2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!bool(__binary_pred(*__first1, *__first2)))
+ return false;
+ return true;
+ }
+ template<typename _II1, typename _II2>
+ inline bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+
+
+
+
+ ;
+ ;
+ return std::__lexicographical_compare_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2),
+ std::__niter_base(__last2));
+ }
+ template<typename _II1, typename _II2, typename _Compare>
+ bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2, _Compare __comp)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+
+
+ ;
+ ;
+ __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (__comp(*__first1, *__first2))
+ return true;
+ if (__comp(*__first2, *__first1))
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2)
+ {
+
+
+
+ ;
+ while (__first1 != __last1 && *__first1 == *__first2)
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _BinaryPredicate>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ while (__first1 != __last1 && bool(__binary_pred(*__first1, *__first2)))
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+}
+
+
+extern "C" {
+typedef unsigned long __ULong;
+struct _reent;
+struct _Bigint
+{
+ struct _Bigint *_next;
+ int _k, _maxwds, _sign, _wds;
+ __ULong _x[1];
+};
+struct __tm
+{
+ int __tm_sec;
+ int __tm_min;
+ int __tm_hour;
+ int __tm_mday;
+ int __tm_mon;
+ int __tm_year;
+ int __tm_wday;
+ int __tm_yday;
+ int __tm_isdst;
+};
+struct _on_exit_args {
+ void * _fnargs[32];
+ void * _dso_handle[32];
+ __ULong _fntypes;
+ __ULong _is_cxa;
+};
+struct _atexit {
+ struct _atexit *_next;
+ int _ind;
+ void (*_fns[32])(void);
+ struct _on_exit_args _on_exit_args;
+};
+struct __sbuf {
+ unsigned char *_base;
+ int _size;
+};
+struct __sFILE {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _offset;
+ struct _reent *_data;
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+ int _flags2;
+};
+struct __sFILE64 {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ struct _reent *_data;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _flags2;
+ _off64_t _offset;
+ _fpos64_t (__attribute__((__cdecl__)) * _seek64) (struct _reent *, void *, _fpos64_t, int);
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+};
+typedef struct __sFILE64 __FILE;
+struct _glue
+{
+ struct _glue *_next;
+ int _niobs;
+ __FILE *_iobs;
+};
+struct _rand48 {
+ unsigned short _seed[3];
+ unsigned short _mult[3];
+ unsigned short _add;
+};
+struct _reent
+{
+ int _errno;
+ __FILE *_stdin, *_stdout, *_stderr;
+ int _inc;
+ char _emergency[25];
+ int _current_category;
+ const char *_current_locale;
+ int __sdidinit;
+ void (__attribute__((__cdecl__)) * __cleanup) (struct _reent *);
+ struct _Bigint *_result;
+ int _result_k;
+ struct _Bigint *_p5s;
+ struct _Bigint **_freelist;
+ int _cvtlen;
+ char *_cvtbuf;
+ union
+ {
+ struct
+ {
+ unsigned int _unused_rand;
+ char * _strtok_last;
+ char _asctime_buf[26];
+ struct __tm _localtime_buf;
+ int _gamma_signgam;
+ __extension__ unsigned long long _rand_next;
+ struct _rand48 _r48;
+ _mbstate_t _mblen_state;
+ _mbstate_t _mbtowc_state;
+ _mbstate_t _wctomb_state;
+ char _l64a_buf[8];
+ char _signal_buf[24];
+ int _getdate_err;
+ _mbstate_t _mbrlen_state;
+ _mbstate_t _mbrtowc_state;
+ _mbstate_t _mbsrtowcs_state;
+ _mbstate_t _wcrtomb_state;
+ _mbstate_t _wcsrtombs_state;
+ int _h_errno;
+ } _reent;
+ struct
+ {
+ unsigned char * _nextf[30];
+ unsigned int _nmalloc[30];
+ } _unused;
+ } _new;
+ struct _atexit *_atexit;
+ struct _atexit _atexit0;
+ void (**(_sig_func))(int);
+ struct _glue __sglue;
+ __FILE __sf[3];
+};
+extern struct _reent *_impure_ptr ;
+extern struct _reent *const _global_impure_ptr ;
+void _reclaim_reent (struct _reent *);
+ struct _reent * __attribute__((__cdecl__)) __getreent (void);
+}
+extern "C" {
+char *mkdtemp (char *);
+}
+extern "C"
+{
+const char *getprogname (void);
+void setprogname (const char *);
+char *realpath (const char *, char *);
+char *canonicalize_file_name (const char *);
+int unsetenv (const char *);
+char *initstate (unsigned seed, char *state, size_t size);
+long random (void);
+char *setstate (const char *state);
+void srandom (unsigned);
+char *ptsname (int);
+int grantpt (int);
+int unlockpt (int);
+int posix_openpt (int);
+int posix_memalign (void **, size_t, size_t);
+extern void * memalign (size_t, size_t);
+extern void * valloc (size_t);
+}
+extern "C" {
+typedef struct
+{
+ int quot;
+ int rem;
+} div_t;
+typedef struct
+{
+ long quot;
+ long rem;
+} ldiv_t;
+typedef struct
+{
+ long long int quot;
+ long long int rem;
+} lldiv_t;
+int __attribute__((__cdecl__)) __locale_mb_cur_max (void);
+void __attribute__((__cdecl__)) abort (void) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) abs (int);
+int __attribute__((__cdecl__)) atexit (void (*__func)(void));
+double __attribute__((__cdecl__)) atof (const char *__nptr);
+float __attribute__((__cdecl__)) atoff (const char *__nptr);
+int __attribute__((__cdecl__)) atoi (const char *__nptr);
+int __attribute__((__cdecl__)) _atoi_r (struct _reent *, const char *__nptr);
+long __attribute__((__cdecl__)) atol (const char *__nptr);
+long __attribute__((__cdecl__)) _atol_r (struct _reent *, const char *__nptr);
+void * __attribute__((__cdecl__)) bsearch (const void * __key, const void * __base, size_t __nmemb, size_t __size, int (__attribute__((__cdecl__)) * _compar) (const void *, const void *));
+void * __attribute__((__cdecl__)) calloc (size_t __nmemb, size_t __size) __attribute__ ((nothrow));
+div_t __attribute__((__cdecl__)) div (int __numer, int __denom);
+void __attribute__((__cdecl__)) exit (int __status) __attribute__ ((noreturn));
+void __attribute__((__cdecl__)) free (void *) __attribute__ ((nothrow));
+char * __attribute__((__cdecl__)) getenv (const char *__string);
+char * __attribute__((__cdecl__)) _getenv_r (struct _reent *, const char *__string);
+char * __attribute__((__cdecl__)) _findenv (const char *, int *);
+char * __attribute__((__cdecl__)) _findenv_r (struct _reent *, const char *, int *);
+extern char *suboptarg;
+int __attribute__((__cdecl__)) getsubopt (char **, char * const *, char **);
+long __attribute__((__cdecl__)) labs (long);
+ldiv_t __attribute__((__cdecl__)) ldiv (long __numer, long __denom);
+void * __attribute__((__cdecl__)) malloc (size_t __size) __attribute__ ((nothrow));
+int __attribute__((__cdecl__)) mblen (const char *, size_t);
+int __attribute__((__cdecl__)) _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) mbtowc (wchar_t *, const char *, size_t);
+int __attribute__((__cdecl__)) _mbtowc_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) wctomb (char *, wchar_t);
+int __attribute__((__cdecl__)) _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) mbstowcs (wchar_t *, const char *, size_t);
+size_t __attribute__((__cdecl__)) _mbstowcs_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) wcstombs (char *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) _wcstombs_r (struct _reent *, char *, const wchar_t *, size_t, _mbstate_t *);
+char * __attribute__((__cdecl__)) mkdtemp (char *);
+int __attribute__((__cdecl__)) mkostemp (char *, int);
+int __attribute__((__cdecl__)) mkostemps (char *, int, int);
+int __attribute__((__cdecl__)) mkstemp (char *);
+int __attribute__((__cdecl__)) mkstemps (char *, int);
+char * __attribute__((__cdecl__)) mktemp (char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+char * __attribute__((__cdecl__)) _mkdtemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkostemp_r (struct _reent *, char *, int);
+int __attribute__((__cdecl__)) _mkostemps_r (struct _reent *, char *, int, int);
+int __attribute__((__cdecl__)) _mkstemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkstemps_r (struct _reent *, char *, int);
+char * __attribute__((__cdecl__)) _mktemp_r (struct _reent *, char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+void __attribute__((__cdecl__)) qsort (void * __base, size_t __nmemb, size_t __size, int(*_compar)(const void *, const void *));
+int __attribute__((__cdecl__)) rand (void);
+void * __attribute__((__cdecl__)) realloc (void * __r, size_t __size) __attribute__ ((nothrow));
+void * __attribute__((__cdecl__)) reallocf (void * __r, size_t __size);
+void __attribute__((__cdecl__)) srand (unsigned __seed);
+double __attribute__((__cdecl__)) strtod (const char *__n, char **__end_PTR);
+double __attribute__((__cdecl__)) _strtod_r (struct _reent *,const char *__n, char **__end_PTR);
+float __attribute__((__cdecl__)) strtof (const char *__n, char **__end_PTR);
+long __attribute__((__cdecl__)) strtol (const char *__n, char **__end_PTR, int __base);
+long __attribute__((__cdecl__)) _strtol_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) strtoul (const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) _strtoul_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+int __attribute__((__cdecl__)) system (const char *__string);
+long __attribute__((__cdecl__)) a64l (const char *__input);
+char * __attribute__((__cdecl__)) l64a (long __input);
+char * __attribute__((__cdecl__)) _l64a_r (struct _reent *,long __input);
+int __attribute__((__cdecl__)) on_exit (void (*__func)(int, void *),void * __arg);
+void __attribute__((__cdecl__)) _Exit (int __status) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) putenv (char *__string);
+int __attribute__((__cdecl__)) _putenv_r (struct _reent *, char *__string);
+void * __attribute__((__cdecl__)) _reallocf_r (struct _reent *, void *, size_t);
+int __attribute__((__cdecl__)) setenv (const char *__string, const char *__value, int __overwrite);
+int __attribute__((__cdecl__)) _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite);
+char * __attribute__((__cdecl__)) gcvt (double,int,char *);
+char * __attribute__((__cdecl__)) gcvtf (float,int,char *);
+char * __attribute__((__cdecl__)) fcvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) fcvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) fcvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) ecvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) dtoa (double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) rand_r (unsigned *__seed);
+double __attribute__((__cdecl__)) drand48 (void);
+double __attribute__((__cdecl__)) _drand48_r (struct _reent *);
+double __attribute__((__cdecl__)) erand48 (unsigned short [3]);
+double __attribute__((__cdecl__)) _erand48_r (struct _reent *, unsigned short [3]);
+long __attribute__((__cdecl__)) jrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _jrand48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) lcong48 (unsigned short [7]);
+void __attribute__((__cdecl__)) _lcong48_r (struct _reent *, unsigned short [7]);
+long __attribute__((__cdecl__)) lrand48 (void);
+long __attribute__((__cdecl__)) _lrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) mrand48 (void);
+long __attribute__((__cdecl__)) _mrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) nrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _nrand48_r (struct _reent *, unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) seed48 (unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) _seed48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) srand48 (long);
+void __attribute__((__cdecl__)) _srand48_r (struct _reent *, long);
+long long __attribute__((__cdecl__)) atoll (const char *__nptr);
+long long __attribute__((__cdecl__)) _atoll_r (struct _reent *, const char *__nptr);
+long long __attribute__((__cdecl__)) llabs (long long);
+lldiv_t __attribute__((__cdecl__)) lldiv (long long __numer, long long __denom);
+long long __attribute__((__cdecl__)) strtoll (const char *__n, char **__end_PTR, int __base);
+long long __attribute__((__cdecl__)) _strtoll_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) strtoull (const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) _strtoull_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+char * __attribute__((__cdecl__)) _dtoa_r (struct _reent *, double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) _system_r (struct _reent *, const char *);
+void __attribute__((__cdecl__)) __eprintf (const char *, const char *, unsigned int, const char *);
+}
+namespace std {
+ using ::div_t;
+ using ::ldiv_t;
+ using ::abort;
+ using ::abs;
+ using ::atexit;
+ using ::atof;
+ using ::atoi;
+ using ::atol;
+ using ::bsearch;
+ using ::calloc;
+ using ::div;
+ using ::exit;
+ using ::free;
+ using ::getenv;
+ using ::labs;
+ using ::ldiv;
+ using ::malloc;
+ using ::mblen;
+ using ::mbstowcs;
+ using ::mbtowc;
+ using ::qsort;
+ using ::rand;
+ using ::realloc;
+ using ::srand;
+ using ::strtod;
+ using ::strtol;
+ using ::strtoul;
+ using ::system;
+ using ::wcstombs;
+ using ::wctomb;
+ inline long
+ abs(long __i) { return labs(__i); }
+ inline ldiv_t
+ div(long __i, long __j) { return ldiv(__i, __j); }
+}
+
+
+namespace std {
+ template<typename _FIter, typename _Tp>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ copy(_IIter, _IIter, _OIter);
+ template<typename _BIter1, typename _BIter2>
+ _BIter2
+ copy_backward(_BIter1, _BIter1, _BIter2);
+ template<typename _FIter, typename _Tp>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _FIter, typename _Tp>
+ void
+ fill(_FIter, _FIter, const _Tp&);
+ template<typename _OIter, typename _Size, typename _Tp>
+ _OIter
+ fill_n(_OIter, _Size, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _BIter>
+ void
+ inplace_merge(_BIter, _BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ void
+ inplace_merge(_BIter, _BIter, _BIter, _Compare);
+ template<typename _FIter1, typename _FIter2>
+ void
+ iter_swap(_FIter1, _FIter2);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _RAIter>
+ void
+ make_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ make_heap(_RAIter, _RAIter, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ max(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ max(const _Tp&, const _Tp&, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ min(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ min(const _Tp&, const _Tp&, _Compare);
+ template<typename _BIter>
+ bool
+ next_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ next_permutation(_BIter, _BIter, _Compare);
+ template<typename _IIter, typename _RAIter>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
+ template<typename _IIter, typename _RAIter, typename _Compare>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ pop_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ pop_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter>
+ bool
+ prev_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ prev_permutation(_BIter, _BIter, _Compare);
+ template<typename _RAIter>
+ void
+ push_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ push_heap(_RAIter, _RAIter, _Compare);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ remove(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Predicate>
+ _FIter
+ remove_if(_FIter, _FIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ remove_copy(_IIter, _IIter, _OIter, const _Tp&);
+ template<typename _IIter, typename _OIter, typename _Predicate>
+ _OIter
+ remove_copy_if(_IIter, _IIter, _OIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);
+ template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
+ _OIter
+ replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);
+ template<typename _BIter>
+ void
+ reverse(_BIter, _BIter);
+ template<typename _BIter, typename _OIter>
+ _OIter
+ reverse_copy(_BIter, _BIter, _OIter);
+ template<typename _FIter>
+ void
+ rotate(_FIter, _FIter, _FIter);
+ template<typename _FIter, typename _OIter>
+ _OIter
+ rotate_copy(_FIter, _FIter, _FIter, _OIter);
+ template<typename _RAIter>
+ void
+ sort_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ stable_partition(_BIter, _BIter, _Predicate);
+ template<typename _Tp>
+ void
+ swap(_Tp&, _Tp&);
+ template<typename _Tp, size_t _Nm>
+ void
+ swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
+ template<typename _FIter1, typename _FIter2>
+ _FIter2
+ swap_ranges(_FIter1, _FIter1, _FIter2);
+ template<typename _FIter>
+ _FIter
+ unique(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ unique(_FIter, _FIter, _BinaryPredicate);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&, _Compare);
+}
+namespace std {
+ template<typename _FIter>
+ _FIter
+ adjacent_find(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ adjacent_find(_FIter, _FIter, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ typename iterator_traits<_IIter>::difference_type
+ count(_IIter, _IIter, const _Tp&);
+ template<typename _IIter, typename _Predicate>
+ typename iterator_traits<_IIter>::difference_type
+ count_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ equal(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ bool
+ equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ _IIter
+ find(_IIter, _IIter, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Predicate>
+ _IIter
+ find_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter, typename _Funct>
+ _Funct
+ for_each(_IIter, _IIter, _Funct);
+ template<typename _FIter, typename _Generator>
+ void
+ generate(_FIter, _FIter, _Generator);
+ template<typename _OIter, typename _Size, typename _Generator>
+ _OIter
+ generate_n(_OIter, _Size, _Generator);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _FIter>
+ _FIter
+ max_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ max_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _FIter>
+ _FIter
+ min_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ min_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _RAIter>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ partition(_BIter, _BIter, _Predicate);
+ template<typename _RAIter>
+ void
+ random_shuffle(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Generator>
+ void
+ random_shuffle(_RAIter, _RAIter,
+ _Generator&);
+ template<typename _FIter, typename _Tp>
+ void
+ replace(_FIter, _FIter, const _Tp&, const _Tp&);
+ template<typename _FIter, typename _Predicate, typename _Tp>
+ void
+ replace_if(_FIter, _FIter, _Predicate, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _FIter, typename _Size, typename _Tp>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&);
+ template<typename _FIter, typename _Size, typename _Tp,
+ typename _BinaryPredicate>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
+ _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _RAIter>
+ void
+ sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort(_RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ stable_sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ stable_sort(_RAIter, _RAIter, _Compare);
+ template<typename _IIter, typename _OIter, typename _UnaryOperation>
+ _OIter
+ transform(_IIter, _IIter, _OIter, _UnaryOperation);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _BinaryOperation>
+ _OIter
+ transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter);
+ template<typename _IIter, typename _OIter, typename _BinaryPredicate>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
+}
+namespace std {
+ template<typename _RandomAccessIterator, typename _Distance>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__first[__parent] < __first[__child])
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n,
+ _Compare __comp)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__comp(__first[__parent], __first[__child]))
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Distance __n)
+ { return std::__is_heap_until(__first, __n) == __n; }
+ template<typename _RandomAccessIterator, typename _Compare,
+ typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)
+ { return std::__is_heap_until(__first, __n, __comp) == __n; }
+ template<typename _RandomAccessIterator>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ { return std::__is_heap(__first, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ { return std::__is_heap(__first, __comp, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __push_heap(_RandomAccessIterator __first,
+ _Distance __holeIndex, _Distance __topIndex, _Tp __value)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex && *(__first + __parent) < __value)
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value));
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
+ typename _Compare>
+ void
+ __push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __topIndex, _Tp __value, _Compare __comp)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex
+ && __comp(*(__first + __parent), __value))
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Tp, typename _Compare>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value, _Compare __comp)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (__comp(*(__first + __secondChild),
+ *(__first + (__secondChild - 1))))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value));
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value),
+ __comp);
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ }
+}
+
+
+
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class exception
+ {
+ public:
+ exception() throw() { }
+ virtual ~exception() throw();
+ virtual const char* what() const throw();
+ };
+ class bad_exception : public exception
+ {
+ public:
+ bad_exception() throw() { }
+ virtual ~bad_exception() throw();
+ virtual const char* what() const throw();
+ };
+ typedef void (*terminate_handler) ();
+ typedef void (*unexpected_handler) ();
+ terminate_handler set_terminate(terminate_handler) throw();
+ void terminate() throw() __attribute__ ((__noreturn__));
+ unexpected_handler set_unexpected(unexpected_handler) throw();
+ void unexpected() __attribute__ ((__noreturn__));
+ bool uncaught_exception() throw() __attribute__ ((__pure__));
+}
+namespace __gnu_cxx {
+ void __verbose_terminate_handler();
+}
+}
+#pragma GCC visibility pop
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class bad_alloc : public exception
+ {
+ public:
+ bad_alloc() throw() { }
+ virtual ~bad_alloc() throw();
+ virtual const char* what() const throw();
+ };
+ struct nothrow_t { };
+ extern const nothrow_t nothrow;
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler) throw();
+}
+void* operator new(std::size_t) throw (std::bad_alloc);
+void* operator new[](std::size_t) throw (std::bad_alloc);
+void operator delete(void*) throw();
+void operator delete[](void*) throw();
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { }
+inline void operator delete[](void*, void*) throw() { }
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _T1, typename _T2>
+ inline void
+ _Construct(_T1* __p, const _T2& __value)
+ {
+ ::new(static_cast<void*>(__p)) _T1((__value));
+ }
+ template<typename _Tp>
+ inline void
+ _Destroy(_Tp* __pointer)
+ { __pointer->~_Tp(); }
+ template<bool>
+ struct _Destroy_aux
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ for (; __first != __last; ++__first)
+ std::_Destroy(&*__first);
+ }
+ };
+ template<>
+ struct _Destroy_aux<true>
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator, _ForwardIterator) { }
+ };
+ template<typename _ForwardIterator>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _Value_type;
+ std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
+ __destroy(__first, __last);
+ }
+ template <typename _Tp> class allocator;
+ template<typename _ForwardIterator, typename _Allocator>
+ void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ _Allocator& __alloc)
+ {
+ for (; __first != __last; ++__first)
+ __alloc.destroy(&*__first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ allocator<_Tp>&)
+ {
+ _Destroy(__first, __last);
+ }
+}
+namespace std {
+ template<bool>
+ struct __uninitialized_copy
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ std::_Construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_copy<true>
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ { return std::copy(__first, __last, __result); }
+ };
+ template<typename _InputIterator, typename _ForwardIterator>
+ inline _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType2;
+ return std::__uninitialized_copy<(__is_pod(_ValueType1)
+ && __is_pod(_ValueType2))>::
+ uninitialized_copy(__first, __last, __result);
+ }
+ template<bool>
+ struct __uninitialized_fill
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ { std::fill(__first, __last, __x); }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill<__is_pod(_ValueType)>::
+ uninitialized_fill(__first, __last, __x);
+ }
+ template<bool>
+ struct __uninitialized_construct_range_dispatch
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator __first, _ForwardIterator __last,
+ _Tp& __value)
+ {
+ if(__first == __last)
+ return;
+ _ForwardIterator __cur = __first;
+ try
+ {
+ std::_Construct(&*__first, (__value));
+ _ForwardIterator __prev = __cur;
+ ++__cur;
+ for(; __cur != __last; ++__cur, ++__prev)
+ std::_Construct(&*__cur, (*__prev));
+ __value = (*__prev);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_construct_range_dispatch<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ __uninitialized_construct_range(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Tp& __value)
+ {
+ typedef typename std::iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_construct_range_dispatch<
+ __has_trivial_constructor(_ValueType)>::
+ __ucr(__first, __last, __value);
+ }
+ template<bool>
+ struct __uninitialized_fill_n
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill_n<true>
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ { std::fill_n(__first, __n, __x); }
+ };
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ inline void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill_n<__is_pod(_ValueType)>::
+ uninitialized_fill_n(__first, __n, __x);
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ __alloc.construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
+ inline _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, allocator<_Tp>&)
+ { return std::uninitialized_copy(__first, __last, __result); }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ return std::__uninitialized_copy_a((__first),
+ (__last),
+ __result, __alloc);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Allocator>
+ void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Tp2>
+ inline void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill(__first, __last, __x); }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Allocator>
+ void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Tp2>
+ inline void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill_n(__first, __n, __x); }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_copy_move(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_copy(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
+ const _Tp& __x, _InputIterator __first,
+ _InputIterator __last, _Allocator& __alloc)
+ {
+ std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
+ typename _Allocator>
+ inline void
+ __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2,
+ _ForwardIterator __last2, const _Tp& __x,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
+ __first2,
+ __alloc);
+ try
+ {
+ std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first2, __mid2, __alloc);
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Tp>
+ pair<_Tp*, ptrdiff_t>
+ get_temporary_buffer(ptrdiff_t __len)
+ {
+ const ptrdiff_t __max =
+ __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
+ if (__len > __max)
+ __len = __max;
+ while (__len > 0)
+ {
+ _Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
+ std::nothrow));
+ if (__tmp != 0)
+ return std::pair<_Tp*, ptrdiff_t>(__tmp, __len);
+ __len /= 2;
+ }
+ return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
+ }
+ template<typename _Tp>
+ inline void
+ return_temporary_buffer(_Tp* __p)
+ { ::operator delete(__p, std::nothrow); }
+ template<typename _ForwardIterator, typename _Tp>
+ class _Temporary_buffer
+ {
+
+ public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef pointer iterator;
+ typedef ptrdiff_t size_type;
+ protected:
+ size_type _M_original_len;
+ size_type _M_len;
+ pointer _M_buffer;
+ public:
+ size_type
+ size() const
+ { return _M_len; }
+ size_type
+ requested_size() const
+ { return _M_original_len; }
+ iterator
+ begin()
+ { return _M_buffer; }
+ iterator
+ end()
+ { return _M_buffer + _M_len; }
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last);
+ ~_Temporary_buffer()
+ {
+ std::_Destroy(_M_buffer, _M_buffer + _M_len);
+ std::return_temporary_buffer(_M_buffer);
+ }
+ private:
+ _Temporary_buffer(const _Temporary_buffer&);
+ void
+ operator=(const _Temporary_buffer&);
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ _Temporary_buffer<_ForwardIterator, _Tp>::
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+ : _M_original_len(std::distance(__first, __last)),
+ _M_len(0), _M_buffer(0)
+ {
+ try
+ {
+ std::pair<pointer, size_type> __p(std::get_temporary_buffer<
+ value_type>(_M_original_len));
+ _M_buffer = __p.first;
+ _M_len = __p.second;
+ if(_M_buffer)
+ std::__uninitialized_construct_range(_M_buffer, _M_buffer + _M_len,
+ *__first);
+ }
+ catch(...)
+ {
+ std::return_temporary_buffer(_M_buffer);
+ _M_buffer = 0;
+ _M_len = 0;
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
+ {
+
+ if (*__a < *__b)
+ {
+ if (*__b < *__c)
+ std::iter_swap(__a, __b);
+ else if (*__a < *__c)
+ std::iter_swap(__a, __c);
+ }
+ else if (*__a < *__c)
+ return;
+ else if (*__b < *__c)
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _Iterator, typename _Compare>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
+ _Compare __comp)
+ {
+
+ if (__comp(*__a, *__b))
+ {
+ if (__comp(*__b, *__c))
+ std::iter_swap(__a, __b);
+ else if (__comp(*__a, *__c))
+ std::iter_swap(__a, __c);
+ }
+ else if (__comp(*__a, *__c))
+ return;
+ else if (__comp(*__b, *__c))
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ __find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val, input_iterator_tag)
+ {
+ while (__first != __last && !(*__first == __val))
+ ++__first;
+ return __first;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ __find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred, input_iterator_tag)
+ {
+ while (__first != __last && !bool(__pred(*__first)))
+ ++__first;
+ return __first;
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ const _Tp& __val, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 2:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 1:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Predicate>
+ _RandomAccessIterator
+ __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Predicate __pred, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 2:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 1:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ std::forward_iterator_tag)
+ {
+ __first = std::find(__first, __last, __val);
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && *__i == __val)
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = std::find(++__i, __last, __val);
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!(*__lookAhead == __val))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ *__backTrack == __val; --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::forward_iterator_tag)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = ++__i;
+ while (__first != __last
+ && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!bool(__binary_pred(*__lookAhead, __val)))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ __binary_pred(*__backTrack, __val); --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2, __last2);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2,
+ __last2, __comp);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1),
+ __rlast1,
+ _RevIterator2(__last2),
+ __rlast2);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BinaryPredicate>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
+ _RevIterator2(__last2), __rlast2,
+ __comp);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2));
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2),
+ __comp);
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ remove_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, const _Tp& __value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!(*__first == __value))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate>
+ _OutputIterator
+ remove_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Predicate __pred)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!bool(__pred(*__first)))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ remove(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+
+
+ ;
+ __first = std::find(__first, __last, __value);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!(*__first == __value))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ remove_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ __first = std::find_if(__first, __last, __pred);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!bool(__pred(*__first)))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!(*__dest == *__first))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last, __binary_pred);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__dest, *__first)))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result,
+ forward_iterator_tag, output_iterator_tag)
+ {
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!(*__first == *__next))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ input_iterator_tag, output_iterator_tag)
+ {
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!(__value == *__first))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result,
+ input_iterator_tag, forward_iterator_tag)
+ {
+ *__result = *__first;
+ while (++__first != __last)
+ if (!(*__result == *__first))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ forward_iterator_tag, output_iterator_tag)
+ {
+
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!bool(__binary_pred(*__first, *__next)))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, output_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!bool(__binary_pred(__value, *__first)))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, forward_iterator_tag)
+ {
+
+ *__result = *__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__result, *__first)))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+ while (true)
+ if (__first == __last || __first == --__last)
+ return;
+ else
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+ if (__first == __last)
+ return;
+ --__last;
+ while (__first < __last)
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ --__last;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ inline void
+ reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
+ {
+
+ ;
+ std::__reverse(__first, __last, std::__iterator_category(__first));
+ }
+ template<typename _BidirectionalIterator, typename _OutputIterator>
+ _OutputIterator
+ reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _OutputIterator __result)
+ {
+
+
+ ;
+ while (__first != __last)
+ {
+ --__last;
+ *__result = *__last;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _EuclideanRingElement>
+ _EuclideanRingElement
+ __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
+ {
+ while (__n != 0)
+ {
+ _EuclideanRingElement __t = __m % __n;
+ __m = __n;
+ __n = __t;
+ }
+ return __m;
+ }
+ template<typename _ForwardIterator>
+ void
+ __rotate(_ForwardIterator __first,
+ _ForwardIterator __middle,
+ _ForwardIterator __last,
+ forward_iterator_tag)
+ {
+ if (__first == __middle || __last == __middle)
+ return;
+ _ForwardIterator __first2 = __middle;
+ do
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ }
+ while (__first2 != __last);
+ __first2 = __middle;
+ while (__first2 != __last)
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ else if (__first2 == __last)
+ __first2 = __middle;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __rotate(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ while (__first != __middle && __middle != __last)
+ {
+ std::iter_swap(__first, --__last);
+ ++__first;
+ }
+ if (__first == __middle)
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ else
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __rotate(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ _Distance __n = __last - __first;
+ _Distance __k = __middle - __first;
+ if (__k == __n - __k)
+ {
+ std::swap_ranges(__first, __middle, __middle);
+ return;
+ }
+ _RandomAccessIterator __p = __first;
+ for (;;)
+ {
+ if (__k < __n - __k)
+ {
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*__p);
+ std::copy(__p + 1, __p + __n, __p);
+ *(__p + __n - 1) = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ std::iter_swap(__p, __q);
+ ++__p;
+ ++__q;
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ __k = __n - __k;
+ }
+ else
+ {
+ __k = __n - __k;
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*(__p + __n - 1));
+ std::copy_backward(__p, __p + __n - 1, __p + __n);
+ *__p = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __n;
+ __p = __q - __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ --__p;
+ --__q;
+ std::iter_swap(__p, __q);
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ }
+ }
+ }
+ template<typename _ForwardIterator>
+ inline void
+ rotate(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last)
+ {
+
+ ;
+ ;
+ typedef typename iterator_traits<_ForwardIterator>::iterator_category
+ _IterType;
+ std::__rotate(__first, __middle, __last, _IterType());
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last, _OutputIterator __result)
+ {
+
+
+ ;
+ ;
+ return std::copy(__first, __middle,
+ std::copy(__middle, __last, __result));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ __partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, forward_iterator_tag)
+ {
+ if (__first == __last)
+ return __first;
+ while (__pred(*__first))
+ if (++__first == __last)
+ return __first;
+ _ForwardIterator __next = __first;
+ while (++__next != __last)
+ if (__pred(*__next))
+ {
+ std::iter_swap(__first, __next);
+ ++__first;
+ }
+ return __first;
+ }
+ template<typename _BidirectionalIterator, typename _Predicate>
+ _BidirectionalIterator
+ __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _Predicate __pred, bidirectional_iterator_tag)
+ {
+ while (true)
+ {
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (__pred(*__first))
+ ++__first;
+ else
+ break;
+ --__last;
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (!bool(__pred(*__last)))
+ --__last;
+ else
+ break;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Distance>
+ _ForwardIterator
+ __inplace_stable_partition(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len)
+ {
+ if (__len == 1)
+ return __pred(*__first) ? __last : __first;
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin = std::__inplace_stable_partition(__first,
+ __middle,
+ __pred,
+ __len / 2);
+ _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
+ __pred,
+ __len
+ - __len / 2);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
+ typename _Distance>
+ _ForwardIterator
+ __stable_partition_adaptive(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len,
+ _Pointer __buffer,
+ _Distance __buffer_size)
+ {
+ if (__len <= __buffer_size)
+ {
+ _ForwardIterator __result1 = __first;
+ _Pointer __result2 = __buffer;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ {
+ *__result1 = (*__first);
+ ++__result1;
+ }
+ else
+ {
+ *__result2 = (*__first);
+ ++__result2;
+ }
+ std::copy(__buffer, __result2, __result1);
+ return __result1;
+ }
+ else
+ {
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin =
+ std::__stable_partition_adaptive(__first, __middle, __pred,
+ __len / 2, __buffer,
+ __buffer_size);
+ _ForwardIterator __end =
+ std::__stable_partition_adaptive(__middle, __last, __pred,
+ __len - __len / 2,
+ __buffer, __buffer_size);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ stable_partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ else
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+ _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.size() > 0)
+ return
+ std::__stable_partition_adaptive(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()),
+ __buf.begin(),
+ _DistanceType(__buf.size()));
+ else
+ return
+ std::__inplace_stable_partition(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()));
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ std::make_heap(__first, __middle);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (*__i < *__first)
+ std::__pop_heap(__first, __middle, __i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ std::make_heap(__first, __middle, __comp);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (__comp(*__i, *__first))
+ std::__pop_heap(__first, __middle, __i, __comp);
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last);
+ while (__first != __last)
+ {
+ if (*__first < *__result_first)
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first));
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last);
+ return __result_real_last;
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last, __comp);
+ while (__first != __last)
+ {
+ if (__comp(*__first, *__result_first))
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first),
+ __comp);
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last, __comp);
+ return __result_real_last;
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__val < *__next)
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__comp(__val, *__next))
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (*__i < *__first)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__first == __last) return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (__comp(*__i, *__first))
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ enum { _S_threshold = 16 };
+ template<typename _RandomAccessIterator>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold));
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
+ }
+ else
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
+ __comp);
+ }
+ else
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, const _Tp& __pivot)
+ {
+ while (true)
+ {
+ while (*__first < __pivot)
+ ++__first;
+ --__last;
+ while (__pivot < *__last)
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ const _Tp& __pivot, _Compare __comp)
+ {
+ while (true)
+ {
+ while (__comp(*__first, __pivot))
+ ++__first;
+ --__last;
+ while (__comp(__pivot, *__last))
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1));
+ return std::__unguarded_partition(__first + 1, __last, *__first);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1), __comp);
+ return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ std::__introsort_loop(__cut, __last, __depth_limit);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit, _Compare __comp)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last, __comp);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ std::__introsort_loop(__cut, __last, __depth_limit, __comp);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last, __comp);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val, __comp);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val, __comp);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val);
+ return __i != __last && !(__val < *__i);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
+ return __i != __last && !bool(__comp(__val, *__i));
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (*__last2 < *__last1)
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3, typename _Compare>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result,
+ _Compare __comp)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (__comp(*__last2, *__last1))
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _Distance>
+ _BidirectionalIterator1
+ __rotate_adaptive(_BidirectionalIterator1 __first,
+ _BidirectionalIterator1 __middle,
+ _BidirectionalIterator1 __last,
+ _Distance __len1, _Distance __len2,
+ _BidirectionalIterator2 __buffer,
+ _Distance __buffer_size)
+ {
+ _BidirectionalIterator2 __buffer_end;
+ if (__len1 > __len2 && __len2 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__middle, __last, __buffer);
+ std::copy_backward(__first, __middle, __last);
+ return std::copy(__buffer, __buffer_end, __first);
+ }
+ else if (__len1 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__first, __middle, __buffer);
+ std::copy(__middle, __last, __first);
+ return std::copy_backward(__buffer, __buffer_end, __last);
+ }
+ else
+ {
+ std::rotate(__first, __middle, __last);
+ std::advance(__first, std::distance(__middle, __last));
+ return __first;
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last,
+ *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle,
+ *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer, __buffer_size);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer, typename _Compare>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first, __comp);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last,__comp);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size, __comp);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer,
+ __buffer_size, __comp);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (*__middle < *__first)
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22);
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Compare>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Compare __comp)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (__comp(*__middle, *__first))
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22, __comp);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22, __comp);
+ }
+ template<typename _BidirectionalIterator>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ _DistanceType __len1 = std::distance(__first, __middle);
+ _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()));
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ const _DistanceType __len1 = std::distance(__first, __middle);
+ const _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1,
+ __len2, __comp);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()),
+ __comp);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result,
+ _Distance __step_size)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance, typename _Compare>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result, _Distance __step_size,
+ _Compare __comp)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result, __comp);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size, _Compare __comp)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size, __comp);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ enum { _S_chunk_size = 7 };
+ template<typename _RandomAccessIterator, typename _Pointer>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer, __step_size);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer,
+ __step_size, __comp);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first,
+ __step_size, __comp);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle,
+ __buffer, __buffer_size);
+ std::__stable_sort_adaptive(__middle, __last,
+ __buffer, __buffer_size);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size);
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance, typename _Compare>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle, __buffer,
+ __buffer_size, __comp);
+ std::__stable_sort_adaptive(__middle, __last, __buffer,
+ __buffer_size, __comp);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size,
+ __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle);
+ std::__inplace_stable_sort(__middle, __last);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last, __comp);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle, __comp);
+ std::__inplace_stable_sort(__middle, __last, __comp);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle,
+ __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first2 < *__first1)
+ return false;
+ else if(*__first1 < *__first2)
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _Compare>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1))
+ return false;
+ else if(__comp(*__first1, *__first2))
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__i < *__ii)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*__i < *--__j))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__i, *__ii))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*__i, *--__j)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__ii < *__i)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*--__j < *__i))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__ii, *__i))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*--__j, *__i)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ replace_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (*__first == __old_value)
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate, typename _Tp>
+ _OutputIterator
+ replace_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (__pred(*__first))
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+}
+namespace std {
+ template<typename _InputIterator, typename _Function>
+ _Function
+ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
+ {
+
+ ;
+ for (; __first != __last; ++__first)
+ __f(*__first);
+ return (__f);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val)
+ {
+
+
+ ;
+ return std::__find(__first, __last, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__find_if(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (*__first1 == *__iter)
+ return __first1;
+ return __last1;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (__comp(*__first1, *__iter))
+ return __first1;
+ return __last1;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (*__first == *__next)
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (__binary_pred(*__first, *__next))
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _InputIterator, typename _Tp>
+ typename iterator_traits<_InputIterator>::difference_type
+ count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (*__first == __value)
+ ++__n;
+ return __n;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ typename iterator_traits<_InputIterator>::difference_type
+ count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ ++__n;
+ return __n;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ return std::find(__first1, __last1, *__first2);
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ __first1 = std::find(__first1, __last1, *__first2);
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (*__current == *__p)
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __predicate)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ return __first1;
+ }
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (__predicate(*__current, *__p))
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ return std::find(__first, __last, __val);
+ return std::__search_n(__first, __last, __count, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ return __first;
+ }
+ return std::__search_n(__first, __last, __count, __val, __binary_pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _UnaryOperation>
+ _OutputIterator
+ transform(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _UnaryOperation __unary_op)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ *__result = __unary_op(*__first);
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _BinaryOperation>
+ _OutputIterator
+ transform(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _OutputIterator __result,
+ _BinaryOperation __binary_op)
+ {
+
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
+ *__result = __binary_op(*__first1, *__first2);
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ void
+ replace(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (*__first == __old_value)
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Tp>
+ void
+ replace_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Generator>
+ void
+ generate(_ForwardIterator __first, _ForwardIterator __last,
+ _Generator __gen)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first)
+ *__first = __gen();
+ }
+ template<typename _OutputIterator, typename _Size, typename _Generator>
+ _OutputIterator
+ generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
+ {
+
+ for (; __n > 0; --__n, ++__first)
+ *__first = __gen();
+ return __first;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ {
+
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result, __binary_pred,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+ ;
+ if (__first != __last)
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
+ }
+ template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
+ void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomNumberGenerator& __rand)
+ {
+
+ ;
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + __rand((__i - __first) + 1));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ inline _ForwardIterator
+ partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__partition(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last);
+ std::sort_heap(__first, __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last, __comp);
+ std::sort_heap(__first, __middle, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2);
+ std::__final_insertion_sort(__first, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ std::__final_insertion_sort(__first, __last, __comp);
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()));
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last, __comp);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()), __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ ++__first1;
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ ++__first1;
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1,
+ __last1, __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2,
+ std::copy(__first1, __last1, __result));
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__first < *__result)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__first, *__result))
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__result < *__first)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last) return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__result, *__first))
+ __result = __first;
+ return __result;
+ }
+}
+
+
+
+
+
+namespace std {
+ template<typename _Alloc>
+ class allocator;
+ template<class _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_string;
+ template<> struct char_traits<char>;
+ typedef basic_string<char> string;
+ template<> struct char_traits<wchar_t>;
+ typedef basic_string<wchar_t> wstring;
+}
+
+
+
+typedef __builtin_va_list __gnuc_va_list;
+extern "C" {
+struct tm;
+typedef _mbstate_t mbstate_t;
+wint_t __attribute__((__cdecl__)) btowc (int);
+int __attribute__((__cdecl__)) wctob (wint_t);
+size_t __attribute__((__cdecl__)) mbrlen (const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbrtowc (wchar_t * , const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbrtowc_r (struct _reent *, wchar_t * , const char * , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) mbsinit (const mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsnrtowcs (wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsnrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsrtowcs (wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcrtomb (char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcrtomb_r (struct _reent *, char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsnrtombs (char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsnrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsrtombs (char * , const wchar_t ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) wcscasecmp (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscat (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcschr (const wchar_t *, wchar_t);
+int __attribute__((__cdecl__)) wcscmp (const wchar_t *, const wchar_t *);
+int __attribute__((__cdecl__)) wcscoll (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcpcpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsdup (const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) _wcsdup_r (struct _reent *, const wchar_t * );
+size_t __attribute__((__cdecl__)) wcscspn (const wchar_t *, const wchar_t *);
+size_t __attribute__((__cdecl__)) wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *);
+size_t __attribute__((__cdecl__)) wcslcat (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslcpy (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslen (const wchar_t *);
+int __attribute__((__cdecl__)) wcsncasecmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncat (wchar_t * , const wchar_t * , size_t);
+int __attribute__((__cdecl__)) wcsncmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wcpncpy (wchar_t * , const wchar_t * , size_t);
+size_t __attribute__((__cdecl__)) wcsnlen (const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcspbrk (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsrchr (const wchar_t *, wchar_t);
+size_t __attribute__((__cdecl__)) wcsspn (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsstr (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcstok (wchar_t *, const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) wcstod (const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) _wcstod_r (struct _reent *, const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) wcstof (const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) _wcstof_r (struct _reent *, const wchar_t *, wchar_t **);
+int __attribute__((__cdecl__)) wcswidth (const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcsxfrm (wchar_t *, const wchar_t *, size_t);
+int __attribute__((__cdecl__)) wcwidth (const wchar_t);
+wchar_t *__attribute__((__cdecl__)) wmemchr (const wchar_t *, wchar_t, size_t);
+int __attribute__((__cdecl__)) wmemcmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemcpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wmemmove (wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemset (wchar_t *, wchar_t, size_t);
+long __attribute__((__cdecl__)) wcstol (const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) wcstoll (const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) wcstoul (const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) wcstoull (const wchar_t *, wchar_t **, int);
+long __attribute__((__cdecl__)) _wcstol_r (struct _reent *, const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) _wcstoll_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) _wcstoul_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) _wcstoull_r (struct _reent *, const wchar_t *, wchar_t **, int);
+wint_t __attribute__((__cdecl__)) fgetwc (__FILE *);
+wchar_t *__attribute__((__cdecl__)) fgetws (wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) fputwc (wchar_t, __FILE *);
+int __attribute__((__cdecl__)) fputws (const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) fwide (__FILE *, int);
+wint_t __attribute__((__cdecl__)) getwc (__FILE *);
+wint_t __attribute__((__cdecl__)) getwchar (void);
+wint_t __attribute__((__cdecl__)) putwc (wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) putwchar (wchar_t);
+wint_t __attribute__((__cdecl__)) ungetwc (wint_t wc, __FILE *);
+wint_t __attribute__((__cdecl__)) _fgetwc_r (struct _reent *, __FILE *);
+wchar_t *__attribute__((__cdecl__)) _fgetws_r (struct _reent *, wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) _fputwc_r (struct _reent *, wchar_t, __FILE *);
+int __attribute__((__cdecl__)) _fputws_r (struct _reent *, const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) _fwide_r (struct _reent *, __FILE *, int);
+wint_t __attribute__((__cdecl__)) _getwc_r (struct _reent *, __FILE *);
+wint_t __attribute__((__cdecl__)) _getwchar_r (struct _reent *ptr);
+wint_t __attribute__((__cdecl__)) _putwc_r (struct _reent *, wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) _putwchar_r (struct _reent *, wchar_t);
+wint_t __attribute__((__cdecl__)) _ungetwc_r (struct _reent *, wint_t wc, __FILE *);
+__FILE *__attribute__((__cdecl__)) open_wmemstream (wchar_t **, size_t *);
+__FILE *__attribute__((__cdecl__)) _open_wmemstream_r (struct _reent *, wchar_t **, size_t *);
+int __attribute__((__cdecl__)) fwprintf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swprintf (wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwprintf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswprintf (wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwprintf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wprintf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwprintf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwprintf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwprintf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wprintf_r (struct _reent *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) fwscanf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swscanf (const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwscanf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswscanf (const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwscanf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wscanf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwscanf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swscanf_r (struct _reent *, const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwscanf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswscanf_r (struct _reent *, const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwscanf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wscanf_r (struct _reent *, const wchar_t *, ...);
+}
+namespace std {
+ using ::mbstate_t;
+}
+namespace std {
+ using ::wint_t;
+ using ::btowc;
+ using ::fgetwc;
+ using ::fgetws;
+ using ::fputwc;
+ using ::fputws;
+ using ::fwide;
+ using ::fwprintf;
+ using ::fwscanf;
+ using ::getwc;
+ using ::getwchar;
+ using ::mbrlen;
+ using ::mbrtowc;
+ using ::mbsinit;
+ using ::mbsrtowcs;
+ using ::putwc;
+ using ::putwchar;
+ using ::swprintf;
+ using ::swscanf;
+ using ::ungetwc;
+ using ::vfwprintf;
+ using ::vfwscanf;
+ using ::vswprintf;
+ using ::vswscanf;
+ using ::vwprintf;
+ using ::vwscanf;
+ using ::wcrtomb;
+ using ::wcscat;
+ using ::wcscmp;
+ using ::wcscoll;
+ using ::wcscpy;
+ using ::wcscspn;
+ using ::wcsftime;
+ using ::wcslen;
+ using ::wcsncat;
+ using ::wcsncmp;
+ using ::wcsncpy;
+ using ::wcsrtombs;
+ using ::wcsspn;
+ using ::wcstod;
+ using ::wcstof;
+ using ::wcstok;
+ using ::wcstol;
+ using ::wcstoul;
+ using ::wcsxfrm;
+ using ::wctob;
+ using ::wmemcmp;
+ using ::wmemcpy;
+ using ::wmemmove;
+ using ::wmemset;
+ using ::wprintf;
+ using ::wscanf;
+ using ::wcschr;
+ using ::wcspbrk;
+ using ::wcsrchr;
+ using ::wcsstr;
+ using ::wmemchr;
+ inline wchar_t*
+ wcschr(wchar_t* __p, wchar_t __c)
+ { return wcschr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcspbrk(wchar_t* __s1, const wchar_t* __s2)
+ { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wcsrchr(wchar_t* __p, wchar_t __c)
+ { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcsstr(wchar_t* __s1, const wchar_t* __s2)
+ { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wmemchr(wchar_t* __p, wchar_t __c, size_t __n)
+ { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }
+}
+namespace std {
+ typedef long long streamoff;
+ typedef ptrdiff_t streamsize;
+ template<typename _StateT>
+ class fpos
+ {
+ private:
+ streamoff _M_off;
+ _StateT _M_state;
+ public:
+ fpos()
+ : _M_off(0), _M_state() { }
+ fpos(streamoff __off)
+ : _M_off(__off), _M_state() { }
+ operator streamoff() const { return _M_off; }
+ void
+ state(_StateT __st)
+ { _M_state = __st; }
+ _StateT
+ state() const
+ { return _M_state; }
+ fpos&
+ operator+=(streamoff __off)
+ {
+ _M_off += __off;
+ return *this;
+ }
+ fpos&
+ operator-=(streamoff __off)
+ {
+ _M_off -= __off;
+ return *this;
+ }
+ fpos
+ operator+(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos += __off;
+ return __pos;
+ }
+ fpos
+ operator-(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos -= __off;
+ return __pos;
+ }
+ streamoff
+ operator-(const fpos& __other) const
+ { return _M_off - __other._M_off; }
+ };
+ template<typename _StateT>
+ inline bool
+ operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) == streamoff(__rhs); }
+ template<typename _StateT>
+ inline bool
+ operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) != streamoff(__rhs); }
+ typedef fpos<mbstate_t> streampos;
+ typedef fpos<mbstate_t> wstreampos;
+}
+namespace std {
+ class ios_base;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ios;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_streambuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_istream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_iostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringbuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_istringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_ostringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_filebuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ifstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ofstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_fstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class ostreambuf_iterator;
+ typedef basic_ios<char> ios;
+ typedef basic_streambuf<char> streambuf;
+ typedef basic_istream<char> istream;
+ typedef basic_ostream<char> ostream;
+ typedef basic_iostream<char> iostream;
+ typedef basic_stringbuf<char> stringbuf;
+ typedef basic_istringstream<char> istringstream;
+ typedef basic_ostringstream<char> ostringstream;
+ typedef basic_stringstream<char> stringstream;
+ typedef basic_filebuf<char> filebuf;
+ typedef basic_ifstream<char> ifstream;
+ typedef basic_ofstream<char> ofstream;
+ typedef basic_fstream<char> fstream;
+ typedef basic_ios<wchar_t> wios;
+ typedef basic_streambuf<wchar_t> wstreambuf;
+ typedef basic_istream<wchar_t> wistream;
+ typedef basic_ostream<wchar_t> wostream;
+ typedef basic_iostream<wchar_t> wiostream;
+ typedef basic_stringbuf<wchar_t> wstringbuf;
+ typedef basic_istringstream<wchar_t> wistringstream;
+ typedef basic_ostringstream<wchar_t> wostringstream;
+ typedef basic_stringstream<wchar_t> wstringstream;
+ typedef basic_filebuf<wchar_t> wfilebuf;
+ typedef basic_ifstream<wchar_t> wifstream;
+ typedef basic_ofstream<wchar_t> wofstream;
+ typedef basic_fstream<wchar_t> wfstream;
+}
+
+
+
+namespace __gnu_cxx {
+ template<typename _CharT>
+ struct _Char_types
+ {
+ typedef unsigned long int_type;
+ typedef std::streampos pos_type;
+ typedef std::streamoff off_type;
+ typedef std::mbstate_t state_type;
+ };
+ template<typename _CharT>
+ struct char_traits
+ {
+ typedef _CharT char_type;
+ typedef typename _Char_types<_CharT>::int_type int_type;
+ typedef typename _Char_types<_CharT>::pos_type pos_type;
+ typedef typename _Char_types<_CharT>::off_type off_type;
+ typedef typename _Char_types<_CharT>::state_type state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
+ static std::size_t
+ length(const char_type* __s);
+ static const char_type*
+ find(const char_type* __s, std::size_t __n, const char_type& __a);
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ assign(char_type* __s, std::size_t __n, char_type __a);
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
+ };
+ template<typename _CharT>
+ int
+ char_traits<_CharT>::
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (lt(__s1[__i], __s2[__i]))
+ return -1;
+ else if (lt(__s2[__i], __s1[__i]))
+ return 1;
+ return 0;
+ }
+ template<typename _CharT>
+ std::size_t
+ char_traits<_CharT>::
+ length(const char_type* __p)
+ {
+ std::size_t __i = 0;
+ while (!eq(__p[__i], char_type()))
+ ++__i;
+ return __i;
+ }
+ template<typename _CharT>
+ const typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ find(const char_type* __s, std::size_t __n, const char_type& __a)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (eq(__s[__i], __a))
+ return __s + __i;
+ return 0;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ move(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ return static_cast<_CharT*>(__builtin_memmove(__s1, __s2,
+ __n * sizeof(char_type)));
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ std::copy(__s2, __s2 + __n, __s1);
+ return __s1;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ assign(char_type* __s, std::size_t __n, char_type __a)
+ {
+ std::fill_n(__s, __n, __a);
+ return __s;
+ }
+}
+namespace std {
+ template<class _CharT>
+ struct char_traits : public __gnu_cxx::char_traits<_CharT>
+ { };
+ template<>
+ struct char_traits<char>
+ {
+ typedef char char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return __builtin_memcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return __builtin_strlen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n)); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memmove(__s1, __s2, __n)); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memcpy(__s1, __s2, __n)); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return static_cast<char_type*>(__builtin_memset(__s, __a, __n)); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return (__c == eof()) ? 0 : __c; }
+ };
+ template<>
+ struct char_traits<wchar_t>
+ {
+ typedef wchar_t char_type;
+ typedef wint_t int_type;
+ typedef streamoff off_type;
+ typedef wstreampos pos_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return wcslen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return wmemchr(__s, __a, __n); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemmove(__s1, __s2, __n); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcpy(__s1, __s2, __n); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return wmemset(__s, __a, __n); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return int_type(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>(((wint_t)-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? 0 : __c; }
+ };
+}
+
+
+
+extern "C" {
+struct lconv
+{
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_n_cs_precedes;
+ char int_n_sep_by_space;
+ char int_n_sign_posn;
+ char int_p_cs_precedes;
+ char int_p_sep_by_space;
+ char int_p_sign_posn;
+};
+char *__attribute__((__cdecl__)) setlocale (int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) localeconv (void);
+struct _reent;
+char *__attribute__((__cdecl__)) _setlocale_r (struct _reent *, int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) _localeconv_r (struct _reent *);
+}
+namespace std {
+ using ::lconv;
+ using ::setlocale;
+ using ::localeconv;
+}
+
+namespace std {
+ typedef int* __c_locale;
+ inline int
+ __convert_from_v(const __c_locale&, char* __out,
+ const int __size __attribute__((__unused__)),
+ const char* __fmt, ...)
+ {
+ char* __old = std::setlocale(4, __null);
+ char* __sav = __null;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ std::setlocale(4, "C");
+ }
+ __builtin_va_list __args;
+ __builtin_va_start(__args, __fmt);
+ const int __ret = __builtin_vsprintf(__out, __fmt, __args);
+ __builtin_va_end(__args);
+ if (__sav)
+ {
+ std::setlocale(4, __sav);
+ delete [] __sav;
+ }
+ return __ret;
+ }
+}
+
+extern "C" {
+int __attribute__((__cdecl__)) isalnum (int __c);
+int __attribute__((__cdecl__)) isalpha (int __c);
+int __attribute__((__cdecl__)) iscntrl (int __c);
+int __attribute__((__cdecl__)) isdigit (int __c);
+int __attribute__((__cdecl__)) isgraph (int __c);
+int __attribute__((__cdecl__)) islower (int __c);
+int __attribute__((__cdecl__)) isprint (int __c);
+int __attribute__((__cdecl__)) ispunct (int __c);
+int __attribute__((__cdecl__)) isspace (int __c);
+int __attribute__((__cdecl__)) isupper (int __c);
+int __attribute__((__cdecl__)) isxdigit (int __c);
+int __attribute__((__cdecl__)) tolower (int __c);
+int __attribute__((__cdecl__)) toupper (int __c);
+int __attribute__((__cdecl__)) isblank (int __c);
+int __attribute__((__cdecl__)) isascii (int __c);
+int __attribute__((__cdecl__)) toascii (int __c);
+extern __attribute__((dllimport)) char *__ctype_ptr__;
+extern __attribute__((dllimport)) const char _ctype_[];
+}
+namespace std {
+ using ::isalnum;
+ using ::isalpha;
+ using ::iscntrl;
+ using ::isdigit;
+ using ::isgraph;
+ using ::islower;
+ using ::isprint;
+ using ::ispunct;
+ using ::isspace;
+ using ::isupper;
+ using ::isxdigit;
+ using ::tolower;
+ using ::toupper;
+}
+namespace std {
+ class locale;
+ template<typename _Facet>
+ bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale&);
+ template<typename _CharT>
+ bool
+ isspace(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isprint(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ iscntrl(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isupper(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ islower(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalpha(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ ispunct(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isxdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalnum(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isgraph(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ toupper(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ tolower(_CharT, const locale&);
+ class ctype_base;
+ template<typename _CharT>
+ class ctype;
+ template<> class ctype<char>;
+ template<> class ctype<wchar_t>;
+ template<typename _CharT>
+ class ctype_byname;
+ class codecvt_base;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt;
+ template<> class codecvt<char, char, mbstate_t>;
+ template<> class codecvt<wchar_t, char, mbstate_t>;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt_byname;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class num_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class num_put;
+
+ template<typename _CharT> class numpunct;
+ template<typename _CharT> class numpunct_byname;
+ template<typename _CharT>
+ class collate;
+ template<typename _CharT> class
+ collate_byname;
+ class time_base;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get_byname;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put_byname;
+ class money_base;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class money_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class money_put;
+
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct;
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct_byname;
+ class messages_base;
+ template<typename _CharT>
+ class messages;
+ template<typename _CharT>
+ class messages_byname;
+}
+
+#pragma GCC visibility push(default)
+extern "C" {
+typedef unsigned long sigset_t;
+extern "C" {
+struct _fpstate
+{
+ unsigned long cw;
+ unsigned long sw;
+ unsigned long tag;
+ unsigned long ipoff;
+ unsigned long cssel;
+ unsigned long dataoff;
+ unsigned long datasel;
+ unsigned char _st[80];
+ unsigned long nxst;
+};
+struct ucontext
+{
+ unsigned long cr2;
+ unsigned long dr0;
+ unsigned long dr1;
+ unsigned long dr2;
+ unsigned long dr3;
+ unsigned long dr6;
+ unsigned long dr7;
+ struct _fpstate fpstate;
+ unsigned long gs;
+ unsigned long fs;
+ unsigned long es;
+ unsigned long ds;
+ unsigned long edi;
+ unsigned long esi;
+ unsigned long ebx;
+ unsigned long edx;
+ unsigned long ecx;
+ unsigned long eax;
+ unsigned long ebp;
+ unsigned long eip;
+ unsigned long cs;
+ unsigned long eflags;
+ unsigned long esp;
+ unsigned long ss;
+ unsigned char _internal;
+ unsigned long oldmask;
+};
+typedef union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+} sigval_t;
+typedef struct sigevent
+{
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+ void (*sigev_notify_function) (sigval_t);
+ pthread_attr_t *sigev_notify_attributes;
+} sigevent_t;
+#pragma pack(push,4)
+struct _sigcommune
+{
+ __uint32_t _si_code;
+ void *_si_read_handle;
+ void *_si_write_handle;
+ void *_si_process_handle;
+ __extension__ union
+ {
+ int _si_fd;
+ void *_si_pipe_fhandler;
+ char *_si_str;
+ };
+};
+typedef struct
+{
+ int si_signo;
+ int si_code;
+ pid_t si_pid;
+ uid_t si_uid;
+ int si_errno;
+ __extension__ union
+ {
+ __uint32_t __pad[32];
+ struct _sigcommune _si_commune;
+ __extension__ union
+ {
+ struct
+ {
+ union
+ {
+ struct
+ {
+ timer_t si_tid;
+ unsigned int si_overrun;
+ };
+ sigval_t si_sigval;
+ sigval_t si_value;
+ };
+ };
+ };
+ __extension__ struct
+ {
+ int si_status;
+ clock_t si_utime;
+ clock_t si_stime;
+ };
+ void *si_addr;
+ };
+} siginfo_t;
+#pragma pack(pop)
+enum
+{
+ SI_USER = 0,
+ SI_ASYNCIO = 2,
+ SI_MESGQ,
+ SI_TIMER,
+ SI_QUEUE,
+ SI_KERNEL,
+ ILL_ILLOPC,
+ ILL_ILLOPN,
+ ILL_ILLADR,
+ ILL_ILLTRP,
+ ILL_PRVOPC,
+ ILL_PRVREG,
+ ILL_COPROC,
+ ILL_BADSTK,
+ FPE_INTDIV,
+ FPE_INTOVF,
+ FPE_FLTDIV,
+ FPE_FLTOVF,
+ FPE_FLTUND,
+ FPE_FLTRES,
+ FPE_FLTINV,
+ FPE_FLTSUB,
+ SEGV_MAPERR,
+ SEGV_ACCERR,
+ BUS_ADRALN,
+ BUS_ADRERR,
+ BUS_OBJERR,
+ CLD_EXITED,
+ CLD_KILLED,
+ CLD_DUMPED,
+ CLD_TRAPPED,
+ CLD_STOPPED,
+ CLD_CONTINUED
+};
+enum
+{
+ SIGEV_SIGNAL = 0,
+ SIGEV_NONE,
+ SIGEV_THREAD
+};
+typedef void (*_sig_func_ptr)(int);
+struct sigaction
+{
+ __extension__ union
+ {
+ _sig_func_ptr sa_handler;
+ void (*sa_sigaction) ( int, siginfo_t *, void * );
+ };
+ sigset_t sa_mask;
+ int sa_flags;
+};
+int sigwait (const sigset_t *, int *);
+int sigwaitinfo (const sigset_t *, siginfo_t *);
+int sighold (int);
+int sigignore (int);
+int sigrelse (int);
+_sig_func_ptr sigset (int, _sig_func_ptr);
+int sigqueue(pid_t, int, const union sigval);
+int siginterrupt (int, int);
+extern const char __attribute__((dllimport)) *sys_sigabbrev[];
+}
+int __attribute__((__cdecl__)) sigprocmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) pthread_sigmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) kill (pid_t, int);
+int __attribute__((__cdecl__)) killpg (pid_t, int);
+int __attribute__((__cdecl__)) sigaction (int, const struct sigaction *, struct sigaction *);
+int __attribute__((__cdecl__)) sigaddset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigdelset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigismember (const sigset_t *, int);
+int __attribute__((__cdecl__)) sigfillset (sigset_t *);
+int __attribute__((__cdecl__)) sigemptyset (sigset_t *);
+int __attribute__((__cdecl__)) sigpending (sigset_t *);
+int __attribute__((__cdecl__)) sigsuspend (const sigset_t *);
+int __attribute__((__cdecl__)) sigpause (int);
+int __attribute__((__cdecl__)) pthread_kill (pthread_t thread, int sig);
+int __attribute__((__cdecl__)) sigwaitinfo (const sigset_t *set, siginfo_t *info);
+int __attribute__((__cdecl__)) sigtimedwait (const sigset_t *set, siginfo_t *info, const struct timespec *timeout);
+int __attribute__((__cdecl__)) sigwait (const sigset_t *set, int *sig);
+int __attribute__((__cdecl__)) sigqueue (pid_t pid, int signo, const union sigval value);
+}
+extern "C" {
+typedef int sig_atomic_t;
+typedef _sig_func_ptr sig_t;
+typedef _sig_func_ptr sighandler_t;
+struct _reent;
+_sig_func_ptr __attribute__((__cdecl__)) _signal_r (struct _reent *, int, _sig_func_ptr);
+int __attribute__((__cdecl__)) _raise_r (struct _reent *, int);
+_sig_func_ptr __attribute__((__cdecl__)) signal (int, _sig_func_ptr);
+int __attribute__((__cdecl__)) raise (int);
+}
+extern "C" {
+struct sched_param {
+ int sched_priority;
+};
+}
+extern "C" {
+int sched_setparam(
+ pid_t __pid,
+ const struct sched_param *__param
+);
+int sched_getparam(
+ pid_t __pid,
+ struct sched_param *__param
+);
+int sched_setscheduler(
+ pid_t __pid,
+ int __policy,
+ const struct sched_param *__param
+);
+int sched_getscheduler(
+ pid_t __pid
+);
+int sched_get_priority_max(
+ int __policy
+);
+int sched_get_priority_min(
+ int __policy
+);
+int sched_rr_get_interval(
+ pid_t __pid,
+ struct timespec *__interval
+);
+int sched_yield( void );
+}
+extern "C"
+{
+int pthread_attr_destroy (pthread_attr_t *);
+int pthread_attr_getdetachstate (const pthread_attr_t *, int *);
+int pthread_attr_getinheritsched (const pthread_attr_t *, int *);
+int pthread_attr_getschedparam (const pthread_attr_t *, struct sched_param *);
+int pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
+int pthread_attr_getscope (const pthread_attr_t *, int *);
+int pthread_attr_init (pthread_attr_t *);
+int pthread_attr_setdetachstate (pthread_attr_t *, int);
+int pthread_attr_setinheritsched (pthread_attr_t *, int);
+int pthread_attr_setschedparam (pthread_attr_t *, const struct sched_param *);
+int pthread_attr_setschedpolicy (pthread_attr_t *, int);
+int pthread_attr_setscope (pthread_attr_t *, int);
+int pthread_attr_getstacksize (const pthread_attr_t *, size_t *);
+int pthread_attr_setstacksize (pthread_attr_t *, size_t);
+int pthread_cancel (pthread_t);
+typedef void (*__cleanup_routine_type) (void *);
+typedef struct _pthread_cleanup_handler
+{
+ __cleanup_routine_type function;
+ void *arg;
+ struct _pthread_cleanup_handler *next;
+} __pthread_cleanup_handler;
+void _pthread_cleanup_push (__pthread_cleanup_handler *handler);
+void _pthread_cleanup_pop (int execute);
+int pthread_cond_broadcast (pthread_cond_t *);
+int pthread_cond_destroy (pthread_cond_t *);
+int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *);
+int pthread_cond_signal (pthread_cond_t *);
+int pthread_cond_timedwait (pthread_cond_t *,
+ pthread_mutex_t *, const struct timespec *);
+int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
+int pthread_condattr_destroy (pthread_condattr_t *);
+int pthread_condattr_getpshared (const pthread_condattr_t *, int *);
+int pthread_condattr_init (pthread_condattr_t *);
+int pthread_condattr_setpshared (pthread_condattr_t *, int);
+int pthread_create (pthread_t *, const pthread_attr_t *,
+ void *(*)(void *), void *);
+int pthread_detach (pthread_t);
+int pthread_equal (pthread_t, pthread_t);
+void pthread_exit (void *);
+int pthread_getschedparam (pthread_t, int *, struct sched_param *);
+void *pthread_getspecific (pthread_key_t);
+int pthread_join (pthread_t, void **);
+int pthread_key_create (pthread_key_t *, void (*)(void *));
+int pthread_key_delete (pthread_key_t);
+int pthread_mutex_destroy (pthread_mutex_t *);
+int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *);
+int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+int pthread_mutex_lock (pthread_mutex_t *);
+int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *);
+int pthread_mutex_trylock (pthread_mutex_t *);
+int pthread_mutex_unlock (pthread_mutex_t *);
+int pthread_mutexattr_destroy (pthread_mutexattr_t *);
+int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getpshared (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_gettype (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_init (pthread_mutexattr_t *);
+int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setprotocol (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setpshared (pthread_mutexattr_t *, int);
+int pthread_mutexattr_settype (pthread_mutexattr_t *, int);
+int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);
+int pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
+int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
+int pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr);
+int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr,
+ int *pshared);
+int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);
+int pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr);
+int pthread_once (pthread_once_t *, void (*)(void));
+int pthread_getconcurrency (void);
+int pthread_setconcurrency (int);
+pthread_t pthread_self (void);
+int pthread_setcancelstate (int, int *);
+int pthread_setcanceltype (int, int *);
+int pthread_setschedparam (pthread_t, int, const struct sched_param *);
+int pthread_setspecific (pthread_key_t, const void *);
+void pthread_testcancel (void);
+int pthread_suspend (pthread_t);
+int pthread_continue (pthread_t);
+int pthread_yield (void);
+}
+typedef pthread_t __gthread_t;
+typedef pthread_key_t __gthread_key_t;
+typedef pthread_once_t __gthread_once_t;
+typedef pthread_mutex_t __gthread_mutex_t;
+typedef pthread_mutex_t __gthread_recursive_mutex_t;
+typedef pthread_cond_t __gthread_cond_t;
+typedef struct timespec __gthread_time_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static inline int
+__gthread_active_p (void)
+{
+ return 1;
+}
+static inline int
+__gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
+ void *__args)
+{
+ return pthread_create (__threadid, __null, __func, __args);
+}
+static inline int
+__gthread_join (__gthread_t __threadid, void **__value_ptr)
+{
+ return pthread_join (__threadid, __value_ptr);
+}
+static inline int
+__gthread_detach (__gthread_t __threadid)
+{
+ return pthread_detach (__threadid);
+}
+static inline int
+__gthread_equal (__gthread_t __t1, __gthread_t __t2)
+{
+ return pthread_equal (__t1, __t2);
+}
+static inline __gthread_t
+__gthread_self (void)
+{
+ return pthread_self ();
+}
+static inline int
+__gthread_yield (void)
+{
+ return sched_yield ();
+}
+static inline int
+__gthread_once (__gthread_once_t *__once, void (*__func) (void))
+{
+ if (__gthread_active_p ())
+ return pthread_once (__once, __func);
+ else
+ return -1;
+}
+static inline int
+__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
+{
+ return pthread_key_create (__key, __dtor);
+}
+static inline int
+__gthread_key_delete (__gthread_key_t __key)
+{
+ return pthread_key_delete (__key);
+}
+static inline void *
+__gthread_getspecific (__gthread_key_t __key)
+{
+ return pthread_getspecific (__key);
+}
+static inline int
+__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
+{
+ return pthread_setspecific (__key, __ptr);
+}
+static inline int
+__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_destroy (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_lock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_lock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_trylock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_unlock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_lock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_trylock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_unlock (__mutex);
+}
+static inline int
+__gthread_cond_broadcast (__gthread_cond_t *__cond)
+{
+ return pthread_cond_broadcast (__cond);
+}
+static inline int
+__gthread_cond_signal (__gthread_cond_t *__cond)
+{
+ return pthread_cond_signal (__cond);
+}
+static inline int
+__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
+{
+ return pthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return pthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return __gthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_destroy (__gthread_cond_t* __cond)
+{
+ return pthread_cond_destroy (__cond);
+}
+#pragma GCC visibility pop
+typedef int _Atomic_word;
+namespace __gnu_cxx {
+ static inline _Atomic_word
+ __exchange_and_add(volatile _Atomic_word* __mem, int __val)
+ { return __sync_fetch_and_add(__mem, __val); }
+ static inline void
+ __atomic_add(volatile _Atomic_word* __mem, int __val)
+ { __sync_fetch_and_add(__mem, __val); }
+ static inline _Atomic_word
+ __exchange_and_add_single(_Atomic_word* __mem, int __val)
+ {
+ _Atomic_word __result = *__mem;
+ *__mem += __val;
+ return __result;
+ }
+ static inline void
+ __atomic_add_single(_Atomic_word* __mem, int __val)
+ { *__mem += __val; }
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ return __exchange_and_add(__mem, __val);
+ else
+ return __exchange_and_add_single(__mem, __val);
+ }
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ __atomic_add(__mem, __val);
+ else
+ __atomic_add_single(__mem, __val);
+ }
+}
+
+
+namespace __gnu_cxx {
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+ ~new_allocator() throw() { }
+ pointer
+ address(reference __x) const { return &__x; }
+ const_pointer
+ address(const_reference __x) const { return &__x; }
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__n > this->max_size())
+ std::__throw_bad_alloc();
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+ size_type
+ max_size() const throw()
+ { return size_t(-1) / sizeof(_Tp); }
+ void
+ construct(pointer __p, const _Tp& __val)
+ { ::new((void *)__p) _Tp(__val); }
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+ template<typename _Tp>
+ inline bool
+ operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return false; }
+}
+namespace std {
+ template<typename _Tp>
+ class allocator;
+ template<>
+ class allocator<void>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ };
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ allocator() throw() { }
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+ ~allocator() throw() { }
+ };
+ template<typename _T1, typename _T2>
+ inline bool
+ operator==(const allocator<_T1>&, const allocator<_T2>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator==(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return true; }
+ template<typename _T1, typename _T2>
+ inline bool
+ operator!=(const allocator<_T1>&, const allocator<_T2>&)
+ { return false; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return false; }
+ extern template class allocator<char>;
+ extern template class allocator<wchar_t>;
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_swap
+ { static void _S_do_it(_Alloc&, _Alloc&) { } };
+ template<typename _Alloc>
+ struct __alloc_swap<_Alloc, false>
+ {
+ static void
+ _S_do_it(_Alloc& __one, _Alloc& __two)
+ {
+ if (__one != __two)
+ swap(__one, __two);
+ }
+ };
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_neq
+ {
+ static bool
+ _S_do_it(const _Alloc&, const _Alloc&)
+ { return false; }
+ };
+ template<typename _Alloc>
+ struct __alloc_neq<_Alloc, false>
+ {
+ static bool
+ _S_do_it(const _Alloc& __one, const _Alloc& __two)
+ { return __one != __two; }
+ };
+}
+
+
+#pragma GCC visibility push(default)
+namespace __cxxabiv1
+{
+ class __forced_unwind
+ {
+ virtual ~__forced_unwind() throw();
+ virtual void __pure_dummy() = 0;
+ };
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_write(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const streamsize __put = __out.rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ __out.setstate(__ios_base::badbit);
+ }
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const _CharT __c = __out.fill();
+ for (; __n > 0; --__n)
+ {
+ const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
+ if (_Traits::eq_int_type(__put, _Traits::eof()))
+ {
+ __out.setstate(__ios_base::badbit);
+ break;
+ }
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ typename __ostream_type::sentry __cerb(__out);
+ if (__cerb)
+ {
+ try
+ {
+ const streamsize __w = __out.width();
+ if (__w > __n)
+ {
+ const bool __left = ((__out.flags()
+ & __ios_base::adjustfield)
+ == __ios_base::left);
+ if (!__left)
+ __ostream_fill(__out, __w - __n);
+ if (__out.good())
+ __ostream_write(__out, __s, __n);
+ if (__left && __out.good())
+ __ostream_fill(__out, __w - __n);
+ }
+ else
+ __ostream_write(__out, __s, __n);
+ __out.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(__ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
+ extern template wostream& __ostream_insert(wostream&, const wchar_t*,
+ streamsize);
+}
+namespace std {
+ template<typename _Arg, typename _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Tp>
+ struct plus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x + __y; }
+ };
+ template<typename _Tp>
+ struct minus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x - __y; }
+ };
+ template<typename _Tp>
+ struct multiplies : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x * __y; }
+ };
+ template<typename _Tp>
+ struct divides : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x / __y; }
+ };
+ template<typename _Tp>
+ struct modulus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x % __y; }
+ };
+ template<typename _Tp>
+ struct negate : public unary_function<_Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x) const
+ { return -__x; }
+ };
+ template<typename _Tp>
+ struct equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x == __y; }
+ };
+ template<typename _Tp>
+ struct not_equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x != __y; }
+ };
+ template<typename _Tp>
+ struct greater : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x > __y; }
+ };
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
+ template<typename _Tp>
+ struct greater_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x >= __y; }
+ };
+ template<typename _Tp>
+ struct less_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x <= __y; }
+ };
+ template<typename _Tp>
+ struct logical_and : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x && __y; }
+ };
+ template<typename _Tp>
+ struct logical_or : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x || __y; }
+ };
+ template<typename _Tp>
+ struct logical_not : public unary_function<_Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x) const
+ { return !__x; }
+ };
+ template<typename _Tp>
+ struct bit_and : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x & __y; }
+ };
+ template<typename _Tp>
+ struct bit_or : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x | __y; }
+ };
+ template<typename _Tp>
+ struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x ^ __y; }
+ };
+ template<typename _Predicate>
+ class unary_negate
+ : public unary_function<typename _Predicate::argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ unary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::argument_type& __x) const
+ { return !_M_pred(__x); }
+ };
+ template<typename _Predicate>
+ inline unary_negate<_Predicate>
+ not1(const _Predicate& __pred)
+ { return unary_negate<_Predicate>(__pred); }
+ template<typename _Predicate>
+ class binary_negate
+ : public binary_function<typename _Predicate::first_argument_type,
+ typename _Predicate::second_argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ binary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::first_argument_type& __x,
+ const typename _Predicate::second_argument_type& __y) const
+ { return !_M_pred(__x, __y); }
+ };
+ template<typename _Predicate>
+ inline binary_negate<_Predicate>
+ not2(const _Predicate& __pred)
+ { return binary_negate<_Predicate>(__pred); }
+ template<typename _Arg, typename _Result>
+ class pointer_to_unary_function : public unary_function<_Arg, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg);
+ public:
+ pointer_to_unary_function() { }
+ explicit
+ pointer_to_unary_function(_Result (*__x)(_Arg))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg __x) const
+ { return _M_ptr(__x); }
+ };
+ template<typename _Arg, typename _Result>
+ inline pointer_to_unary_function<_Arg, _Result>
+ ptr_fun(_Result (*__x)(_Arg))
+ { return pointer_to_unary_function<_Arg, _Result>(__x); }
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ class pointer_to_binary_function
+ : public binary_function<_Arg1, _Arg2, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg1, _Arg2);
+ public:
+ pointer_to_binary_function() { }
+ explicit
+ pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg1 __x, _Arg2 __y) const
+ { return _M_ptr(__x, __y); }
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
+ ptr_fun(_Result (*__x)(_Arg1, _Arg2))
+ { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
+ template<typename _Tp>
+ struct _Identity : public unary_function<_Tp,_Tp>
+ {
+ _Tp&
+ operator()(_Tp& __x) const
+ { return __x; }
+ const _Tp&
+ operator()(const _Tp& __x) const
+ { return __x; }
+ };
+ template<typename _Pair>
+ struct _Select1st : public unary_function<_Pair,
+ typename _Pair::first_type>
+ {
+ typename _Pair::first_type&
+ operator()(_Pair& __x) const
+ { return __x.first; }
+ const typename _Pair::first_type&
+ operator()(const _Pair& __x) const
+ { return __x.first; }
+ };
+ template<typename _Pair>
+ struct _Select2nd : public unary_function<_Pair,
+ typename _Pair::second_type>
+ {
+ typename _Pair::second_type&
+ operator()(_Pair& __x) const
+ { return __x.second; }
+ const typename _Pair::second_type&
+ operator()(const _Pair& __x) const
+ { return __x.second; }
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_t : public unary_function<_Tp*, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_ref_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)())
+ { return mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)())
+ { return mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+}
+namespace std {
+ template<typename _Operation>
+ class binder1st
+ : public unary_function<typename _Operation::second_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::first_argument_type value;
+ public:
+ binder1st(const _Operation& __x,
+ const typename _Operation::first_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ typename _Operation::result_type
+ operator()(typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder1st<_Operation>
+ bind1st(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::first_argument_type _Arg1_type;
+ return binder1st<_Operation>(__fn, _Arg1_type(__x));
+ }
+ template<typename _Operation>
+ class binder2nd
+ : public unary_function<typename _Operation::first_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::second_argument_type value;
+ public:
+ binder2nd(const _Operation& __x,
+ const typename _Operation::second_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ typename _Operation::result_type
+ operator()(typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder2nd<_Operation>
+ bind2nd(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::second_argument_type _Arg2_type;
+ return binder2nd<_Operation>(__fn, _Arg2_type(__x));
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string
+ {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+ public:
+ typedef _Traits traits_type;
+ typedef typename _Traits::char_type value_type;
+ typedef _Alloc allocator_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ typedef typename _CharT_alloc_type::difference_type difference_type;
+ typedef typename _CharT_alloc_type::reference reference;
+ typedef typename _CharT_alloc_type::const_reference const_reference;
+ typedef typename _CharT_alloc_type::pointer pointer;
+ typedef typename _CharT_alloc_type::const_pointer const_pointer;
+ typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
+ typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
+ const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ private:
+ struct _Rep_base
+ {
+ size_type _M_length;
+ size_type _M_capacity;
+ _Atomic_word _M_refcount;
+ };
+ struct _Rep : _Rep_base
+ {
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
+ static const size_type _S_max_size;
+ static const _CharT _S_terminal;
+ static size_type _S_empty_rep_storage[];
+ static _Rep&
+ _S_empty_rep()
+ {
+ void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
+ return *reinterpret_cast<_Rep*>(__p);
+ }
+ bool
+ _M_is_leaked() const
+ { return this->_M_refcount < 0; }
+ bool
+ _M_is_shared() const
+ { return this->_M_refcount > 0; }
+ void
+ _M_set_leaked()
+ { this->_M_refcount = -1; }
+ void
+ _M_set_sharable()
+ { this->_M_refcount = 0; }
+ void
+ _M_set_length_and_sharable(size_type __n)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ {
+ this->_M_set_sharable();
+ this->_M_length = __n;
+ traits_type::assign(this->_M_refdata()[__n], _S_terminal);
+ }
+ }
+ _CharT*
+ _M_refdata() throw()
+ { return reinterpret_cast<_CharT*>(this + 1); }
+ _CharT*
+ _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
+ {
+ return (!_M_is_leaked() && __alloc1 == __alloc2)
+ ? _M_refcopy() : _M_clone(__alloc1);
+ }
+ static _Rep*
+ _S_create(size_type, size_type, const _Alloc&);
+ void
+ _M_dispose(const _Alloc& __a)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
+ -1) <= 0)
+ _M_destroy(__a);
+ }
+ void
+ _M_destroy(const _Alloc&) throw();
+ _CharT*
+ _M_refcopy() throw()
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
+ return _M_refdata();
+ }
+ _CharT*
+ _M_clone(const _Alloc&, size_type __res = 0);
+ };
+ struct _Alloc_hider : _Alloc
+ {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a)
+ : _Alloc(__a), _M_p(__dat) { }
+ _CharT* _M_p;
+ };
+ public:
+ static const size_type npos = static_cast<size_type>(-1);
+ private:
+ mutable _Alloc_hider _M_dataplus;
+ _CharT*
+ _M_data() const
+ { return _M_dataplus._M_p; }
+ _CharT*
+ _M_data(_CharT* __p)
+ { return (_M_dataplus._M_p = __p); }
+ _Rep*
+ _M_rep() const
+ { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
+ iterator
+ _M_ibegin() const
+ { return iterator(_M_data()); }
+ iterator
+ _M_iend() const
+ { return iterator(_M_data() + this->size()); }
+ void
+ _M_leak()
+ {
+ if (!_M_rep()->_M_is_leaked())
+ _M_leak_hard();
+ }
+ size_type
+ _M_check(size_type __pos, const char* __s) const
+ {
+ if (__pos > this->size())
+ __throw_out_of_range((__s));
+ return __pos;
+ }
+ void
+ _M_check_length(size_type __n1, size_type __n2, const char* __s) const
+ {
+ if (this->max_size() - (this->size() - __n1) < __n2)
+ __throw_length_error((__s));
+ }
+ size_type
+ _M_limit(size_type __pos, size_type __off) const
+ {
+ const bool __testoff = __off < this->size() - __pos;
+ return __testoff ? __off : this->size() - __pos;
+ }
+ bool
+ _M_disjunct(const _CharT* __s) const
+ {
+ return (less<const _CharT*>()(__s, _M_data())
+ || less<const _CharT*>()(_M_data() + this->size(), __s));
+ }
+ static void
+ _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::copy(__d, __s, __n);
+ }
+ static void
+ _M_move(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::move(__d, __s, __n);
+ }
+ static void
+ _M_assign(_CharT* __d, size_type __n, _CharT __c)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, __c);
+ else
+ traits_type::assign(__d, __n, __c);
+ }
+ template<class _Iterator>
+ static void
+ _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
+ {
+ for (; __k1 != __k2; ++__k1, ++__p)
+ traits_type::assign(*__p, *__k1);
+ }
+ static void
+ _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static void
+ _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static int
+ _S_compare(size_type __n1, size_type __n2)
+ {
+ const difference_type __d = difference_type(__n1 - __n2);
+ if (__d > __gnu_cxx::__numeric_traits<int>::__max)
+ return __gnu_cxx::__numeric_traits<int>::__max;
+ else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
+ return __gnu_cxx::__numeric_traits<int>::__min;
+ else
+ return int(__d);
+ }
+ void
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2);
+ void
+ _M_leak_hard();
+ static _Rep&
+ _S_empty_rep()
+ { return _Rep::_S_empty_rep(); }
+ public:
+ basic_string()
+ : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
+ explicit
+ basic_string(const _Alloc& __a);
+ basic_string(const basic_string& __str);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n = npos);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a);
+ basic_string(const _CharT* __s, size_type __n,
+ const _Alloc& __a = _Alloc());
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
+ template<class _InputIterator>
+ basic_string(_InputIterator __beg, _InputIterator __end,
+ const _Alloc& __a = _Alloc());
+ ~basic_string()
+ { _M_rep()->_M_dispose(this->get_allocator()); }
+ basic_string&
+ operator=(const basic_string& __str)
+ { return this->assign(__str); }
+ basic_string&
+ operator=(const _CharT* __s)
+ { return this->assign(__s); }
+ basic_string&
+ operator=(_CharT __c)
+ {
+ this->assign(1, __c);
+ return *this;
+ }
+ iterator
+ begin()
+ {
+ _M_leak();
+ return iterator(_M_data());
+ }
+ const_iterator
+ begin() const
+ { return const_iterator(_M_data()); }
+ iterator
+ end()
+ {
+ _M_leak();
+ return iterator(_M_data() + this->size());
+ }
+ const_iterator
+ end() const
+ { return const_iterator(_M_data() + this->size()); }
+ reverse_iterator
+ rbegin()
+ { return reverse_iterator(this->end()); }
+ const_reverse_iterator
+ rbegin() const
+ { return const_reverse_iterator(this->end()); }
+ reverse_iterator
+ rend()
+ { return reverse_iterator(this->begin()); }
+ const_reverse_iterator
+ rend() const
+ { return const_reverse_iterator(this->begin()); }
+ public:
+ size_type
+ size() const
+ { return _M_rep()->_M_length; }
+ size_type
+ length() const
+ { return _M_rep()->_M_length; }
+ size_type
+ max_size() const
+ { return _Rep::_S_max_size; }
+ void
+ resize(size_type __n, _CharT __c);
+ void
+ resize(size_type __n)
+ { this->resize(__n, _CharT()); }
+ size_type
+ capacity() const
+ { return _M_rep()->_M_capacity; }
+ void
+ reserve(size_type __res_arg = 0);
+ void
+ clear()
+ { _M_mutate(0, this->size(), 0); }
+ bool
+ empty() const
+ { return this->size() == 0; }
+ const_reference
+ operator[] (size_type __pos) const
+ {
+ ;
+ return _M_data()[__pos];
+ }
+ reference
+ operator[](size_type __pos)
+ {
+ ;
+ ;
+ _M_leak();
+ return _M_data()[__pos];
+ }
+ const_reference
+ at(size_type __n) const
+ {
+ if (__n >= this->size())
+ __throw_out_of_range(("basic_string::at"));
+ return _M_data()[__n];
+ }
+ reference
+ at(size_type __n)
+ {
+ if (__n >= size())
+ __throw_out_of_range(("basic_string::at"));
+ _M_leak();
+ return _M_data()[__n];
+ }
+ basic_string&
+ operator+=(const basic_string& __str)
+ { return this->append(__str); }
+ basic_string&
+ operator+=(const _CharT* __s)
+ { return this->append(__s); }
+ basic_string&
+ operator+=(_CharT __c)
+ {
+ this->push_back(__c);
+ return *this;
+ }
+ basic_string&
+ append(const basic_string& __str);
+ basic_string&
+ append(const basic_string& __str, size_type __pos, size_type __n);
+ basic_string&
+ append(const _CharT* __s, size_type __n);
+ basic_string&
+ append(const _CharT* __s)
+ {
+ ;
+ return this->append(__s, traits_type::length(__s));
+ }
+ basic_string&
+ append(size_type __n, _CharT __c);
+ template<class _InputIterator>
+ basic_string&
+ append(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_iend(), _M_iend(), __first, __last); }
+ void
+ push_back(_CharT __c)
+ {
+ const size_type __len = 1 + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ traits_type::assign(_M_data()[this->size()], __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ basic_string&
+ assign(const basic_string& __str);
+ basic_string&
+ assign(const basic_string& __str, size_type __pos, size_type __n)
+ { return this->assign(__str._M_data()
+ + __str._M_check(__pos, "basic_string::assign"),
+ __str._M_limit(__pos, __n)); }
+ basic_string&
+ assign(const _CharT* __s, size_type __n);
+ basic_string&
+ assign(const _CharT* __s)
+ {
+ ;
+ return this->assign(__s, traits_type::length(__s));
+ }
+ basic_string&
+ assign(size_type __n, _CharT __c)
+ { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
+ template<class _InputIterator>
+ basic_string&
+ assign(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
+ void
+ insert(iterator __p, size_type __n, _CharT __c)
+ { this->replace(__p, __p, __n, __c); }
+ template<class _InputIterator>
+ void
+ insert(iterator __p, _InputIterator __beg, _InputIterator __end)
+ { this->replace(__p, __p, __beg, __end); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str)
+ { return this->insert(__pos1, __str, size_type(0), __str.size()); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str,
+ size_type __pos2, size_type __n)
+ { return this->insert(__pos1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::insert"),
+ __str._M_limit(__pos2, __n)); }
+ basic_string&
+ insert(size_type __pos, const _CharT* __s, size_type __n);
+ basic_string&
+ insert(size_type __pos, const _CharT* __s)
+ {
+ ;
+ return this->insert(__pos, __s, traits_type::length(__s));
+ }
+ basic_string&
+ insert(size_type __pos, size_type __n, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
+ size_type(0), __n, __c); }
+ iterator
+ insert(iterator __p, _CharT __c)
+ {
+ ;
+ const size_type __pos = __p - _M_ibegin();
+ _M_replace_aux(__pos, size_type(0), size_type(1), __c);
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ basic_string&
+ erase(size_type __pos = 0, size_type __n = npos)
+ {
+ _M_mutate(_M_check(__pos, "basic_string::erase"),
+ _M_limit(__pos, __n), size_type(0));
+ return *this;
+ }
+ iterator
+ erase(iterator __position)
+ {
+ ;
+ const size_type __pos = __position - _M_ibegin();
+ _M_mutate(__pos, size_type(1), size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ iterator
+ erase(iterator __first, iterator __last);
+ basic_string&
+ replace(size_type __pos, size_type __n, const basic_string& __str)
+ { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2)
+ { return this->replace(__pos1, __n1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::replace"),
+ __str._M_limit(__pos2, __n2)); }
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s)
+ {
+ ;
+ return this->replace(__pos, __n1, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
+ _M_limit(__pos, __n1), __n2, __c); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const basic_string& __str)
+ { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
+ {
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s)
+ {
+ ;
+ return this->replace(__i1, __i2, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
+ {
+ ;
+ return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
+ }
+ template<class _InputIterator>
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ _InputIterator __k1, _InputIterator __k2)
+ {
+ ;
+ ;
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const _CharT* __k1, const _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const_iterator __k1, const_iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ private:
+ template<class _Integer>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
+ _Integer __val, __true_type)
+ { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
+ template<class _InputIterator>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type);
+ basic_string&
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c);
+ basic_string&
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ template<class _InIterator>
+ static _CharT*
+ _S_construct_aux(_InIterator __beg, _InIterator __end,
+ const _Alloc& __a, __false_type)
+ {
+ typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
+ return _S_construct(__beg, __end, __a, _Tag());
+ }
+ template<class _Integer>
+ static _CharT*
+ _S_construct_aux(_Integer __beg, _Integer __end,
+ const _Alloc& __a, __true_type)
+ { return _S_construct_aux_2(static_cast<size_type>(__beg),
+ __end, __a); }
+ static _CharT*
+ _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
+ { return _S_construct(__req, __c, __a); }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
+ {
+ typedef typename std::__is_integer<_InIterator>::__type _Integral;
+ return _S_construct_aux(__beg, __end, __a, _Integral());
+ }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag);
+ template<class _FwdIterator>
+ static _CharT*
+ _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
+ forward_iterator_tag);
+ static _CharT*
+ _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
+ public:
+ size_type
+ copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
+ void
+ swap(basic_string& __s);
+ const _CharT*
+ c_str() const
+ { return _M_data(); }
+ const _CharT*
+ data() const
+ { return _M_data(); }
+ allocator_type
+ get_allocator() const
+ { return _M_dataplus; }
+ size_type
+ find(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find(const basic_string& __str, size_type __pos = 0) const
+ { return this->find(__str.data(), __pos, __str.size()); }
+ size_type
+ find(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find(_CharT __c, size_type __pos = 0) const;
+ size_type
+ rfind(const basic_string& __str, size_type __pos = npos) const
+ { return this->rfind(__str.data(), __pos, __str.size()); }
+ size_type
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ rfind(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->rfind(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ rfind(_CharT __c, size_type __pos = npos) const;
+ size_type
+ find_first_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_of(_CharT __c, size_type __pos = 0) const
+ { return this->find(__c, __pos); }
+ size_type
+ find_last_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_of(_CharT __c, size_type __pos = npos) const
+ { return this->rfind(__c, __pos); }
+ size_type
+ find_first_not_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_not_of(_CharT __c, size_type __pos = 0) const;
+ size_type
+ find_last_not_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_not_of(_CharT __c, size_type __pos = npos) const;
+ basic_string
+ substr(size_type __pos = 0, size_type __n = npos) const
+ { return basic_string(*this,
+ _M_check(__pos, "basic_string::substr"), __n); }
+ int
+ compare(const basic_string& __str) const
+ {
+ const size_type __size = this->size();
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ int
+ compare(size_type __pos, size_type __n, const basic_string& __str) const;
+ int
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const;
+ int
+ compare(const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const;
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str(__lhs);
+ __str.append(__size_type(1), __rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT>
+ inline
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
+ operator==(const basic_string<_CharT>& __lhs,
+ const basic_string<_CharT>& __rhs)
+ { return (__lhs.size() == __rhs.size()
+ && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
+ __lhs.size())); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline void
+ swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { __lhs.swap(__rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __is, basic_string<char>& __str);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ return __ostream_insert(__os, __str.data(), __str.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ { return getline(__is, __str, __is.widen('\n')); }
+ template<>
+ basic_istream<char>&
+ getline(basic_istream<char>& __in, basic_string<char>& __str,
+ char __delim);
+ template<>
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
+ wchar_t __delim);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const _CharT
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_terminal = _CharT();
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::npos;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
+ (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
+ sizeof(size_type)];
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _CharT __buf[128];
+ size_type __len = 0;
+ while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))
+ {
+ __buf[__len++] = *__beg;
+ ++__beg;
+ }
+ _Rep* __r = _Rep::_S_create(__len, size_type(0), __a);
+ _M_copy(__r->_M_refdata(), __buf, __len);
+ try
+ {
+ while (__beg != __end)
+ {
+ if (__len == __r->_M_capacity)
+ {
+ _Rep* __another = _Rep::_S_create(__len + 1, __len, __a);
+ _M_copy(__another->_M_refdata(), __r->_M_refdata(), __len);
+ __r->_M_destroy(__a);
+ __r = __another;
+ }
+ __r->_M_refdata()[__len++] = *__beg;
+ ++__beg;
+ }
+ }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__len);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template <typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ forward_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
+ __throw_logic_error(("basic_string::_S_construct NULL not valid"));
+ const size_type __dnew = static_cast<size_type>(std::distance(__beg,
+ __end));
+ _Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);
+ try
+ { _S_copy_chars(__r->_M_refdata(), __beg, __end); }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__dnew);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(size_type __n, _CharT __c, const _Alloc& __a)
+ {
+ if (__n == 0 && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
+ if (__n)
+ _M_assign(__r->_M_refdata(), __n, __c);
+ __r->_M_set_length_and_sharable(__n);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str)
+ : _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()),
+ __str.get_allocator()),
+ __str.get_allocator())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _Alloc& __a)
+ : _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos, size_type __n)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, _Alloc()), _Alloc())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
+ __s + npos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__n, __c, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__beg, __end, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const basic_string& __str)
+ {
+ if (_M_rep() != __str._M_rep())
+ {
+ const allocator_type __a = this->get_allocator();
+ _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check_length(this->size(), __n, "basic_string::assign");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(size_type(0), this->size(), __s, __n);
+ else
+ {
+ const size_type __pos = __s - _M_data();
+ if (__pos >= __n)
+ _M_copy(_M_data(), __s, __n);
+ else if (__pos)
+ _M_move(_M_data(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__n);
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(size_type __n, _CharT __c)
+ {
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_assign(_M_data() + this->size(), __n, __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const _CharT* __s, size_type __n)
+ {
+ ;
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (_M_disjunct(__s))
+ this->reserve(__len);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ this->reserve(__len);
+ __s = _M_data() + __off;
+ }
+ }
+ _M_copy(_M_data() + this->size(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str)
+ {
+ const size_type __size = __str.size();
+ if (__size)
+ {
+ const size_type __len = __size + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data(), __size);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str, size_type __pos, size_type __n)
+ {
+ __str._M_check(__pos, "basic_string::append");
+ __n = __str._M_limit(__pos, __n);
+ if (__n)
+ {
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data() + __pos, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ insert(size_type __pos, const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check(__pos, "basic_string::insert");
+ _M_check_length(size_type(0), __n, "basic_string::insert");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, size_type(0), __s, __n);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ _M_mutate(__pos, 0, __n);
+ __s = _M_data() + __off;
+ _CharT* __p = _M_data() + __pos;
+ if (__s + __n <= __p)
+ _M_copy(__p, __s, __n);
+ else if (__s >= __p)
+ _M_copy(__p, __s + __n, __n);
+ else
+ {
+ const size_type __nleft = __p - __s;
+ _M_copy(__p, __s, __nleft);
+ _M_copy(__p + __nleft, __p + __n, __n - __nleft);
+ }
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::iterator
+ basic_string<_CharT, _Traits, _Alloc>::
+ erase(iterator __first, iterator __last)
+ {
+ ;
+ const size_type __size = __last - __first;
+ if (__size)
+ {
+ const size_type __pos = __first - _M_ibegin();
+ _M_mutate(__pos, __size, size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ else
+ return __first;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ ;
+ _M_check(__pos, "basic_string::replace");
+ __n1 = _M_limit(__pos, __n1);
+ _M_check_length(__n1, __n2, "basic_string::replace");
+ bool __left;
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, __n1, __s, __n2);
+ else if ((__left = __s + __n2 <= _M_data() + __pos)
+ || _M_data() + __pos + __n1 <= __s)
+ {
+ size_type __off = __s - _M_data();
+ __left ? __off : (__off += __n2 - __n1);
+ _M_mutate(__pos, __n1, __n2);
+ _M_copy(_M_data() + __pos, _M_data() + __off, __n2);
+ return *this;
+ }
+ else
+ {
+ const basic_string __tmp(__s, __n2);
+ return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_destroy(const _Alloc& __a) throw ()
+ {
+ const size_type __size = sizeof(_Rep_base) +
+ (this->_M_capacity + 1) * sizeof(_CharT);
+ _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_leak_hard()
+ {
+ if (_M_rep() == &_S_empty_rep())
+ return;
+ if (_M_rep()->_M_is_shared())
+ _M_mutate(0, 0, 0);
+ _M_rep()->_M_set_leaked();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2)
+ {
+ const size_type __old_size = this->size();
+ const size_type __new_size = __old_size + __len2 - __len1;
+ const size_type __how_much = __old_size - __pos - __len1;
+ if (__new_size > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ const allocator_type __a = get_allocator();
+ _Rep* __r = _Rep::_S_create(__new_size, this->capacity(), __a);
+ if (__pos)
+ _M_copy(__r->_M_refdata(), _M_data(), __pos);
+ if (__how_much)
+ _M_copy(__r->_M_refdata() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ _M_rep()->_M_dispose(__a);
+ _M_data(__r->_M_refdata());
+ }
+ else if (__how_much && __len1 != __len2)
+ {
+ _M_move(_M_data() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ }
+ _M_rep()->_M_set_length_and_sharable(__new_size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ reserve(size_type __res)
+ {
+ if (__res != this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (__res < this->size())
+ __res = this->size();
+ const allocator_type __a = get_allocator();
+ _CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ swap(basic_string& __s)
+ {
+ if (_M_rep()->_M_is_leaked())
+ _M_rep()->_M_set_sharable();
+ if (__s._M_rep()->_M_is_leaked())
+ __s._M_rep()->_M_set_sharable();
+ if (this->get_allocator() == __s.get_allocator())
+ {
+ _CharT* __tmp = _M_data();
+ _M_data(__s._M_data());
+ __s._M_data(__tmp);
+ }
+ else
+ {
+ const basic_string __tmp1(_M_ibegin(), _M_iend(),
+ __s.get_allocator());
+ const basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
+ this->get_allocator());
+ *this = __tmp2;
+ __s = __tmp1;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _S_create(size_type __capacity, size_type __old_capacity,
+ const _Alloc& __alloc)
+ {
+ if (__capacity > _S_max_size)
+ __throw_length_error(("basic_string::_S_create"));
+ const size_type __pagesize = 4096;
+ const size_type __malloc_header_size = 4 * sizeof(void*);
+ if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
+ __capacity = 2 * __old_capacity;
+ size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ const size_type __adj_size = __size + __malloc_header_size;
+ if (__adj_size > __pagesize && __capacity > __old_capacity)
+ {
+ const size_type __extra = __pagesize - __adj_size % __pagesize;
+ __capacity += __extra / sizeof(_CharT);
+ if (__capacity > _S_max_size)
+ __capacity = _S_max_size;
+ __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ }
+ void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
+ _Rep *__p = new (__place) _Rep;
+ __p->_M_capacity = __capacity;
+ __p->_M_set_sharable();
+ return __p;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_clone(const _Alloc& __alloc, size_type __res)
+ {
+ const size_type __requested_cap = this->_M_length + __res;
+ _Rep* __r = _Rep::_S_create(__requested_cap, this->_M_capacity,
+ __alloc);
+ if (this->_M_length)
+ _M_copy(__r->_M_refdata(), _M_refdata(), this->_M_length);
+ __r->_M_set_length_and_sharable(this->_M_length);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ resize(size_type __n, _CharT __c)
+ {
+ const size_type __size = this->size();
+ _M_check_length(__size, __n, "basic_string::resize");
+ if (__size < __n)
+ this->append(__n - __size, __c);
+ else if (__n < __size)
+ this->erase(__n);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type)
+ {
+ const basic_string __s(__k1, __k2);
+ const size_type __n1 = __i2 - __i1;
+ _M_check_length(__n1, __s.size(), "basic_string::_M_replace_dispatch");
+ return _M_replace_safe(__i1 - _M_ibegin(), __n1, __s._M_data(),
+ __s.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c)
+ {
+ _M_check_length(__n1, __n2, "basic_string::_M_replace_aux");
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_assign(_M_data() + __pos1, __n2, __c);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_copy(_M_data() + __pos1, __s, __n2);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ ;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ const __size_type __len = _Traits::length(__lhs);
+ __string_type __str;
+ __str.reserve(__len + __rhs.size());
+ __str.append(__lhs, __len);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str;
+ const __size_type __len = __rhs.size();
+ __str.reserve(__len + 1);
+ __str.append(__size_type(1), __lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ copy(_CharT* __s, size_type __n, size_type __pos) const
+ {
+ _M_check(__pos, "basic_string::copy");
+ __n = _M_limit(__pos, __n);
+ ;
+ if (__n)
+ _M_copy(__s, _M_data() + __pos, __n);
+ return __n;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ const _CharT* __data = _M_data();
+ if (__n == 0)
+ return __pos <= __size ? __pos : npos;
+ if (__n <= __size)
+ {
+ for (; __pos <= __size - __n; ++__pos)
+ if (traits_type::eq(__data[__pos], __s[0])
+ && traits_type::compare(__data + __pos + 1,
+ __s + 1, __n - 1) == 0)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(_CharT __c, size_type __pos) const
+ {
+ size_type __ret = npos;
+ const size_type __size = this->size();
+ if (__pos < __size)
+ {
+ const _CharT* __data = _M_data();
+ const size_type __n = __size - __pos;
+ const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
+ if (__p)
+ __ret = __p - __data;
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ if (__n <= __size)
+ {
+ __pos = std::min(size_type(__size - __n), __pos);
+ const _CharT* __data = _M_data();
+ do
+ {
+ if (traits_type::compare(__data + __pos, __s, __n) == 0)
+ return __pos;
+ }
+ while (__pos-- > 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ for (++__size; __size-- > 0; )
+ if (traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __n && __pos < this->size(); ++__pos)
+ {
+ const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
+ if (__p)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size && __n)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size-- != 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::find(__s, __n, _M_data()[__pos]))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(_CharT __c, size_type __pos) const
+ {
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::eq(_M_data()[__pos], __c))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n, const basic_string& __str) const
+ {
+ _M_check(__pos, "basic_string::compare");
+ __n = _M_limit(__pos, __n);
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__n, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__n, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const
+ {
+ _M_check(__pos1, "basic_string::compare");
+ __str._M_check(__pos2, "basic_string::compare");
+ __n1 = _M_limit(__pos1, __n1);
+ __n2 = __str._M_limit(__pos2, __n2);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos1,
+ __str.data() + __pos2, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(const _CharT* __s) const
+ {
+ ;
+ const size_type __size = this->size();
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __s, __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__n1, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef typename __ctype_type::ctype_base __ctype_base;
+ __size_type __extracted = 0;
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ _CharT __buf[128];
+ __size_type __len = 0;
+ const streamsize __w = __in.width();
+ const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
+ : __str.max_size();
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(__ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ if (__len == sizeof(__buf) / sizeof(_CharT))
+ {
+ __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
+ __len = 0;
+ }
+ __buf[__len++] = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ __str.append(__buf, __len);
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ __size_type __extracted = 0;
+ const __size_type __n = __str.max_size();
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, true);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ const __int_type __idelim = _Traits::to_int_type(__delim);
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !_Traits::eq_int_type(__c, __idelim))
+ {
+ __str += _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ else if (_Traits::eq_int_type(__c, __idelim))
+ {
+ ++__extracted;
+ __in.rdbuf()->sbumpc();
+ }
+ else
+ __err |= __ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ extern template class basic_string<char>;
+ extern template
+ basic_istream<char>&
+ operator>>(basic_istream<char>&, string&);
+ extern template
+ basic_ostream<char>&
+ operator<<(basic_ostream<char>&, const string&);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&, char);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&);
+ extern template class basic_string<wchar_t>;
+ extern template
+ basic_istream<wchar_t>&
+ operator>>(basic_istream<wchar_t>&, wstring&);
+ extern template
+ basic_ostream<wchar_t>&
+ operator<<(basic_ostream<wchar_t>&, const wstring&);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&, wchar_t);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&);
+}
+namespace std {
+ class locale
+ {
+ public:
+ typedef int category;
+ class facet;
+ class id;
+ class _Impl;
+ friend class facet;
+ friend class _Impl;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ static const category none = 0;
+ static const category ctype = 1L << 0;
+ static const category numeric = 1L << 1;
+ static const category collate = 1L << 2;
+ static const category time = 1L << 3;
+ static const category monetary = 1L << 4;
+ static const category messages = 1L << 5;
+ static const category all = (ctype | numeric | collate |
+ time | monetary | messages);
+ locale() throw();
+ locale(const locale& __other) throw();
+ explicit
+ locale(const char* __s);
+ locale(const locale& __base, const char* __s, category __cat);
+ locale(const locale& __base, const locale& __add, category __cat);
+ template<typename _Facet>
+ locale(const locale& __other, _Facet* __f);
+ ~locale() throw();
+ const locale&
+ operator=(const locale& __other) throw();
+ template<typename _Facet>
+ locale
+ combine(const locale& __other) const;
+ string
+ name() const;
+ bool
+ operator==(const locale& __other) const throw();
+ bool
+ operator!=(const locale& __other) const throw()
+ { return !(this->operator==(__other)); }
+ template<typename _Char, typename _Traits, typename _Alloc>
+ bool
+ operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
+ const basic_string<_Char, _Traits, _Alloc>& __s2) const;
+ static locale
+ global(const locale&);
+ static const locale&
+ classic();
+ private:
+ _Impl* _M_impl;
+ static _Impl* _S_classic;
+ static _Impl* _S_global;
+ static const char* const* const _S_categories;
+ enum { _S_categories_size = 6 + 0 };
+ static __gthread_once_t _S_once;
+ explicit
+ locale(_Impl*) throw();
+ static void
+ _S_initialize();
+ static void
+ _S_initialize_once() throw();
+ static category
+ _S_normalize_category(category);
+ void
+ _M_coalesce(const locale& __base, const locale& __add, category __cat);
+ };
+ class locale::facet
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ mutable _Atomic_word _M_refcount;
+ static __c_locale _S_c_locale;
+ static const char _S_c_name[2];
+ static __gthread_once_t _S_once;
+ static void
+ _S_initialize_once();
+ protected:
+ explicit
+ facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
+ { }
+ virtual
+ ~facet();
+ static void
+ _S_create_c_locale(__c_locale& __cloc, const char* __s,
+ __c_locale __old = 0);
+ static __c_locale
+ _S_clone_c_locale(__c_locale& __cloc) throw();
+ static void
+ _S_destroy_c_locale(__c_locale& __cloc);
+ static __c_locale
+ _S_lc_ctype_c_locale(__c_locale __cloc, const char* __s);
+ static __c_locale
+ _S_get_c_locale();
+ __attribute__ ((__const__)) static const char*
+ _S_get_c_name() throw();
+ private:
+ void
+ _M_add_reference() const throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() const throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ facet(const facet&);
+ facet&
+ operator=(const facet&);
+ };
+ class locale::id
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ mutable size_t _M_index;
+ static _Atomic_word _S_refcount;
+ void
+ operator=(const id&);
+ id(const id&);
+ public:
+ id() { }
+ size_t
+ _M_id() const throw();
+ };
+ class locale::_Impl
+ {
+ public:
+ friend class locale;
+ friend class locale::facet;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ private:
+ _Atomic_word _M_refcount;
+ const facet** _M_facets;
+ size_t _M_facets_size;
+ const facet** _M_caches;
+ char** _M_names;
+ static const locale::id* const _S_id_ctype[];
+ static const locale::id* const _S_id_numeric[];
+ static const locale::id* const _S_id_collate[];
+ static const locale::id* const _S_id_time[];
+ static const locale::id* const _S_id_monetary[];
+ static const locale::id* const _S_id_messages[];
+ static const locale::id* const* const _S_facet_categories[];
+ void
+ _M_add_reference() throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ _Impl(const _Impl&, size_t);
+ _Impl(const char*, size_t);
+ _Impl(size_t) throw();
+ ~_Impl() throw();
+ _Impl(const _Impl&);
+ void
+ operator=(const _Impl&);
+ bool
+ _M_check_same_name()
+ {
+ bool __ret = true;
+ if (_M_names[1])
+ for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
+ __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
+ return __ret;
+ }
+ void
+ _M_replace_categories(const _Impl*, category);
+ void
+ _M_replace_category(const _Impl*, const locale::id* const*);
+ void
+ _M_replace_facet(const _Impl*, const locale::id*);
+ void
+ _M_install_facet(const locale::id*, const facet*);
+ template<typename _Facet>
+ void
+ _M_init_facet(_Facet* __facet)
+ { _M_install_facet(&_Facet::id, __facet); }
+ void
+ _M_install_cache(const facet*, size_t);
+ };
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc);
+ template<typename _CharT>
+ class collate : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ protected:
+ __c_locale _M_c_locale_collate;
+ public:
+ static locale::id id;
+ explicit
+ collate(size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
+ { }
+ explicit
+ collate(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
+ { }
+ int
+ compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
+ string_type
+ transform(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_transform(__lo, __hi); }
+ long
+ hash(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_hash(__lo, __hi); }
+ int
+ _M_compare(const _CharT*, const _CharT*) const throw();
+ size_t
+ _M_transform(_CharT*, const _CharT*, size_t) const throw();
+ protected:
+ virtual
+ ~collate()
+ { _S_destroy_c_locale(_M_c_locale_collate); }
+ virtual int
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const;
+ virtual string_type
+ do_transform(const _CharT* __lo, const _CharT* __hi) const;
+ virtual long
+ do_hash(const _CharT* __lo, const _CharT* __hi) const;
+ };
+ template<typename _CharT>
+ locale::id collate<_CharT>::id;
+ template<>
+ int
+ collate<char>::_M_compare(const char*, const char*) const throw();
+ template<>
+ size_t
+ collate<char>::_M_transform(char*, const char*, size_t) const throw();
+ template<>
+ int
+ collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const throw();
+ template<>
+ size_t
+ collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const throw();
+ template<typename _CharT>
+ class collate_byname : public collate<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ collate_byname(const char* __s, size_t __refs = 0)
+ : collate<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ this->_S_destroy_c_locale(this->_M_c_locale_collate);
+ this->_S_create_c_locale(this->_M_c_locale_collate, __s);
+ }
+ }
+ protected:
+ virtual
+ ~collate_byname() { }
+ };
+}
+
+namespace std {
+ template<typename _Facet>
+ locale::
+ locale(const locale& __other, _Facet* __f)
+ {
+ _M_impl = new _Impl(*__other._M_impl, 1);
+ try
+ { _M_impl->_M_install_facet(&_Facet::id, __f); }
+ catch(...)
+ {
+ _M_impl->_M_remove_reference();
+ throw;
+ }
+ delete [] _M_impl->_M_names[0];
+ _M_impl->_M_names[0] = 0;
+ }
+ template<typename _Facet>
+ locale
+ locale::
+ combine(const locale& __other) const
+ {
+ _Impl* __tmp = new _Impl(*_M_impl, 1);
+ try
+ {
+ __tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
+ }
+ catch(...)
+ {
+ __tmp->_M_remove_reference();
+ throw;
+ }
+ return locale(__tmp);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ bool
+ locale::
+ operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
+ const basic_string<_CharT, _Traits, _Alloc>& __s2) const
+ {
+ typedef std::collate<_CharT> __collate_type;
+ const __collate_type& __collate = use_facet<__collate_type>(*this);
+ return (__collate.compare(__s1.data(), __s1.data() + __s1.length(),
+ __s2.data(), __s2.data() + __s2.length()) < 0);
+ }
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw()
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ return (__i < __loc._M_impl->_M_facets_size
+ && dynamic_cast<const _Facet*>(__facets[__i]));
+ }
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc)
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
+ __throw_bad_cast();
+ return dynamic_cast<const _Facet&>(*__facets[__i]);
+ }
+ template<typename _CharT>
+ int
+ collate<_CharT>::_M_compare(const _CharT*, const _CharT*) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ size_t
+ collate<_CharT>::_M_transform(_CharT*, const _CharT*, size_t) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ int
+ collate<_CharT>::
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ {
+ const string_type __one(__lo1, __hi1);
+ const string_type __two(__lo2, __hi2);
+ const _CharT* __p = __one.c_str();
+ const _CharT* __pend = __one.data() + __one.length();
+ const _CharT* __q = __two.c_str();
+ const _CharT* __qend = __two.data() + __two.length();
+ for (;;)
+ {
+ const int __res = _M_compare(__p, __q);
+ if (__res)
+ return __res;
+ __p += char_traits<_CharT>::length(__p);
+ __q += char_traits<_CharT>::length(__q);
+ if (__p == __pend && __q == __qend)
+ return 0;
+ else if (__p == __pend)
+ return -1;
+ else if (__q == __qend)
+ return 1;
+ __p++;
+ __q++;
+ }
+ }
+ template<typename _CharT>
+ typename collate<_CharT>::string_type
+ collate<_CharT>::
+ do_transform(const _CharT* __lo, const _CharT* __hi) const
+ {
+ string_type __ret;
+ const string_type __str(__lo, __hi);
+ const _CharT* __p = __str.c_str();
+ const _CharT* __pend = __str.data() + __str.length();
+ size_t __len = (__hi - __lo) * 2;
+ _CharT* __c = new _CharT[__len];
+ try
+ {
+ for (;;)
+ {
+ size_t __res = _M_transform(__c, __p, __len);
+ if (__res >= __len)
+ {
+ __len = __res + 1;
+ delete [] __c, __c = 0;
+ __c = new _CharT[__len];
+ __res = _M_transform(__c, __p, __len);
+ }
+ __ret.append(__c, __res);
+ __p += char_traits<_CharT>::length(__p);
+ if (__p == __pend)
+ break;
+ __p++;
+ __ret.push_back(_CharT());
+ }
+ }
+ catch(...)
+ {
+ delete [] __c;
+ throw;
+ }
+ delete [] __c;
+ return __ret;
+ }
+ template<typename _CharT>
+ long
+ collate<_CharT>::
+ do_hash(const _CharT* __lo, const _CharT* __hi) const
+ {
+ unsigned long __val = 0;
+ for (; __lo < __hi; ++__lo)
+ __val =
+ *__lo + ((__val << 7)
+ | (__val >> (__gnu_cxx::__numeric_traits<unsigned long>::
+ __digits - 7)));
+ return static_cast<long>(__val);
+ }
+ extern template class collate<char>;
+ extern template class collate_byname<char>;
+ extern template
+ const collate<char>&
+ use_facet<collate<char> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<char> >(const locale&);
+ extern template class collate<wchar_t>;
+ extern template class collate_byname<wchar_t>;
+ extern template
+ const collate<wchar_t>&
+ use_facet<collate<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<wchar_t> >(const locale&);
+}
+namespace std {
+ enum _Ios_Fmtflags
+ {
+ _S_boolalpha = 1L << 0,
+ _S_dec = 1L << 1,
+ _S_fixed = 1L << 2,
+ _S_hex = 1L << 3,
+ _S_internal = 1L << 4,
+ _S_left = 1L << 5,
+ _S_oct = 1L << 6,
+ _S_right = 1L << 7,
+ _S_scientific = 1L << 8,
+ _S_showbase = 1L << 9,
+ _S_showpoint = 1L << 10,
+ _S_showpos = 1L << 11,
+ _S_skipws = 1L << 12,
+ _S_unitbuf = 1L << 13,
+ _S_uppercase = 1L << 14,
+ _S_adjustfield = _S_left | _S_right | _S_internal,
+ _S_basefield = _S_dec | _S_oct | _S_hex,
+ _S_floatfield = _S_scientific | _S_fixed,
+ _S_ios_fmtflags_end = 1L << 16
+ };
+ inline _Ios_Fmtflags
+ operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Fmtflags&
+ operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a | __b; }
+ inline _Ios_Fmtflags&
+ operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a & __b; }
+ inline _Ios_Fmtflags&
+ operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Fmtflags
+ operator~(_Ios_Fmtflags __a)
+ { return _Ios_Fmtflags(~static_cast<int>(__a)); }
+ enum _Ios_Openmode
+ {
+ _S_app = 1L << 0,
+ _S_ate = 1L << 1,
+ _S_bin = 1L << 2,
+ _S_in = 1L << 3,
+ _S_out = 1L << 4,
+ _S_trunc = 1L << 5,
+ _S_ios_openmode_end = 1L << 16
+ };
+ inline _Ios_Openmode
+ operator&(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator|(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator^(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Openmode&
+ operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a | __b; }
+ inline _Ios_Openmode&
+ operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a & __b; }
+ inline _Ios_Openmode&
+ operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Openmode
+ operator~(_Ios_Openmode __a)
+ { return _Ios_Openmode(~static_cast<int>(__a)); }
+ enum _Ios_Iostate
+ {
+ _S_goodbit = 0,
+ _S_badbit = 1L << 0,
+ _S_eofbit = 1L << 1,
+ _S_failbit = 1L << 2,
+ _S_ios_iostate_end = 1L << 16
+ };
+ inline _Ios_Iostate
+ operator&(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator|(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator^(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Iostate&
+ operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a | __b; }
+ inline _Ios_Iostate&
+ operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a & __b; }
+ inline _Ios_Iostate&
+ operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Iostate
+ operator~(_Ios_Iostate __a)
+ { return _Ios_Iostate(~static_cast<int>(__a)); }
+ enum _Ios_Seekdir
+ {
+ _S_beg = 0,
+ _S_cur = 1,
+ _S_end = 2,
+ _S_ios_seekdir_end = 1L << 16
+ };
+ class ios_base
+ {
+ public:
+ class failure : public exception
+ {
+ public:
+ explicit
+ failure(const string& __str) throw();
+ virtual
+ ~failure() throw();
+ virtual const char*
+ what() const throw();
+ private:
+ string _M_msg;
+ };
+ typedef _Ios_Fmtflags fmtflags;
+ static const fmtflags boolalpha = _S_boolalpha;
+ static const fmtflags dec = _S_dec;
+ static const fmtflags fixed = _S_fixed;
+ static const fmtflags hex = _S_hex;
+ static const fmtflags internal = _S_internal;
+ static const fmtflags left = _S_left;
+ static const fmtflags oct = _S_oct;
+ static const fmtflags right = _S_right;
+ static const fmtflags scientific = _S_scientific;
+ static const fmtflags showbase = _S_showbase;
+ static const fmtflags showpoint = _S_showpoint;
+ static const fmtflags showpos = _S_showpos;
+ static const fmtflags skipws = _S_skipws;
+ static const fmtflags unitbuf = _S_unitbuf;
+ static const fmtflags uppercase = _S_uppercase;
+ static const fmtflags adjustfield = _S_adjustfield;
+ static const fmtflags basefield = _S_basefield;
+ static const fmtflags floatfield = _S_floatfield;
+ typedef _Ios_Iostate iostate;
+ static const iostate badbit = _S_badbit;
+ static const iostate eofbit = _S_eofbit;
+ static const iostate failbit = _S_failbit;
+ static const iostate goodbit = _S_goodbit;
+ typedef _Ios_Openmode openmode;
+ static const openmode app = _S_app;
+ static const openmode ate = _S_ate;
+ static const openmode binary = _S_bin;
+ static const openmode in = _S_in;
+ static const openmode out = _S_out;
+ static const openmode trunc = _S_trunc;
+ typedef _Ios_Seekdir seekdir;
+ static const seekdir beg = _S_beg;
+ static const seekdir cur = _S_cur;
+ static const seekdir end = _S_end;
+ typedef int io_state;
+ typedef int open_mode;
+ typedef int seek_dir;
+ typedef std::streampos streampos;
+ typedef std::streamoff streamoff;
+ enum event
+ {
+ erase_event,
+ imbue_event,
+ copyfmt_event
+ };
+ typedef void (*event_callback) (event, ios_base&, int);
+ void
+ register_callback(event_callback __fn, int __index);
+ protected:
+ streamsize _M_precision;
+ streamsize _M_width;
+ fmtflags _M_flags;
+ iostate _M_exception;
+ iostate _M_streambuf_state;
+ struct _Callback_list
+ {
+ _Callback_list* _M_next;
+ ios_base::event_callback _M_fn;
+ int _M_index;
+ _Atomic_word _M_refcount;
+ _Callback_list(ios_base::event_callback __fn, int __index,
+ _Callback_list* __cb)
+ : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
+ void
+ _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ int
+ _M_remove_reference()
+ { return __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); }
+ };
+ _Callback_list* _M_callbacks;
+ void
+ _M_call_callbacks(event __ev) throw();
+ void
+ _M_dispose_callbacks(void) throw();
+ struct _Words
+ {
+ void* _M_pword;
+ long _M_iword;
+ _Words() : _M_pword(0), _M_iword(0) { }
+ };
+ _Words _M_word_zero;
+ enum { _S_local_word_size = 8 };
+ _Words _M_local_word[_S_local_word_size];
+ int _M_word_size;
+ _Words* _M_word;
+ _Words&
+ _M_grow_words(int __index, bool __iword);
+ locale _M_ios_locale;
+ void
+ _M_init() throw();
+ public:
+ class Init
+ {
+ friend class ios_base;
+ public:
+ Init();
+ ~Init();
+ private:
+ static _Atomic_word _S_refcount;
+ static bool _S_synced_with_stdio;
+ };
+ fmtflags
+ flags() const
+ { return _M_flags; }
+ fmtflags
+ flags(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags = __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags |= __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl, fmtflags __mask)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags &= ~__mask;
+ _M_flags |= (__fmtfl & __mask);
+ return __old;
+ }
+ void
+ unsetf(fmtflags __mask)
+ { _M_flags &= ~__mask; }
+ streamsize
+ precision() const
+ { return _M_precision; }
+ streamsize
+ precision(streamsize __prec)
+ {
+ streamsize __old = _M_precision;
+ _M_precision = __prec;
+ return __old;
+ }
+ streamsize
+ width() const
+ { return _M_width; }
+ streamsize
+ width(streamsize __wide)
+ {
+ streamsize __old = _M_width;
+ _M_width = __wide;
+ return __old;
+ }
+ static bool
+ sync_with_stdio(bool __sync = true);
+ locale
+ imbue(const locale& __loc) throw();
+ locale
+ getloc() const
+ { return _M_ios_locale; }
+ const locale&
+ _M_getloc() const
+ { return _M_ios_locale; }
+ static int
+ xalloc() throw();
+ long&
+ iword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, true);
+ return __word._M_iword;
+ }
+ void*&
+ pword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, false);
+ return __word._M_pword;
+ }
+ virtual ~ios_base();
+ protected:
+ ios_base() throw ();
+ private:
+ ios_base(const ios_base&);
+ ios_base&
+ operator=(const ios_base&);
+ };
+ inline ios_base&
+ boolalpha(ios_base& __base)
+ {
+ __base.setf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ noboolalpha(ios_base& __base)
+ {
+ __base.unsetf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ showbase(ios_base& __base)
+ {
+ __base.setf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ noshowbase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ showpoint(ios_base& __base)
+ {
+ __base.setf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ noshowpoint(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ showpos(ios_base& __base)
+ {
+ __base.setf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ noshowpos(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ skipws(ios_base& __base)
+ {
+ __base.setf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ noskipws(ios_base& __base)
+ {
+ __base.unsetf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ uppercase(ios_base& __base)
+ {
+ __base.setf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ nouppercase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ unitbuf(ios_base& __base)
+ {
+ __base.setf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ nounitbuf(ios_base& __base)
+ {
+ __base.unsetf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ internal(ios_base& __base)
+ {
+ __base.setf(ios_base::internal, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ left(ios_base& __base)
+ {
+ __base.setf(ios_base::left, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ right(ios_base& __base)
+ {
+ __base.setf(ios_base::right, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ dec(ios_base& __base)
+ {
+ __base.setf(ios_base::dec, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ hex(ios_base& __base)
+ {
+ __base.setf(ios_base::hex, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ oct(ios_base& __base)
+ {
+ __base.setf(ios_base::oct, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ fixed(ios_base& __base)
+ {
+ __base.setf(ios_base::fixed, ios_base::floatfield);
+ return __base;
+ }
+ inline ios_base&
+ scientific(ios_base& __base)
+ {
+ __base.setf(ios_base::scientific, ios_base::floatfield);
+ return __base;
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
+ basic_streambuf<_CharT, _Traits>*, bool&);
+ template<typename _CharT, typename _Traits>
+ class basic_streambuf
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename traits_type::int_type int_type;
+ typedef typename traits_type::pos_type pos_type;
+ typedef typename traits_type::off_type off_type;
+ typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ friend class basic_ios<char_type, traits_type>;
+ friend class basic_istream<char_type, traits_type>;
+ friend class basic_ostream<char_type, traits_type>;
+ friend class istreambuf_iterator<char_type, traits_type>;
+ friend class ostreambuf_iterator<char_type, traits_type>;
+ friend streamsize
+ __copy_streambufs_eof<>(__streambuf_type*, __streambuf_type*, bool&);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ template<typename _CharT2, typename _Traits2>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ getline(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);
+ protected:
+ char_type* _M_in_beg;
+ char_type* _M_in_cur;
+ char_type* _M_in_end;
+ char_type* _M_out_beg;
+ char_type* _M_out_cur;
+ char_type* _M_out_end;
+ locale _M_buf_locale;
+ public:
+ virtual
+ ~basic_streambuf()
+ { }
+ locale
+ pubimbue(const locale &__loc)
+ {
+ locale __tmp(this->getloc());
+ this->imbue(__loc);
+ _M_buf_locale = __loc;
+ return __tmp;
+ }
+ locale
+ getloc() const
+ { return _M_buf_locale; }
+ __streambuf_type*
+ pubsetbuf(char_type* __s, streamsize __n)
+ { return this->setbuf(__s, __n); }
+ pos_type
+ pubseekoff(off_type __off, ios_base::seekdir __way,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekoff(__off, __way, __mode); }
+ pos_type
+ pubseekpos(pos_type __sp,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekpos(__sp, __mode); }
+ int
+ pubsync() { return this->sync(); }
+ streamsize
+ in_avail()
+ {
+ const streamsize __ret = this->egptr() - this->gptr();
+ return __ret ? __ret : this->showmanyc();
+ }
+ int_type
+ snextc()
+ {
+ int_type __ret = traits_type::eof();
+ if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
+ __ret), true))
+ __ret = this->sgetc();
+ return __ret;
+ }
+ int_type
+ sbumpc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ else
+ __ret = this->uflow();
+ return __ret;
+ }
+ int_type
+ sgetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ __ret = traits_type::to_int_type(*this->gptr());
+ else
+ __ret = this->underflow();
+ return __ret;
+ }
+ streamsize
+ sgetn(char_type* __s, streamsize __n)
+ { return this->xsgetn(__s, __n); }
+ int_type
+ sputbackc(char_type __c)
+ {
+ int_type __ret;
+ const bool __testpos = this->eback() < this->gptr();
+ if (__builtin_expect(!__testpos ||
+ !traits_type::eq(__c, this->gptr()[-1]), false))
+ __ret = this->pbackfail(traits_type::to_int_type(__c));
+ else
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ return __ret;
+ }
+ int_type
+ sungetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->eback() < this->gptr(), true))
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ else
+ __ret = this->pbackfail();
+ return __ret;
+ }
+ int_type
+ sputc(char_type __c)
+ {
+ int_type __ret;
+ if (__builtin_expect(this->pptr() < this->epptr(), true))
+ {
+ *this->pptr() = __c;
+ this->pbump(1);
+ __ret = traits_type::to_int_type(__c);
+ }
+ else
+ __ret = this->overflow(traits_type::to_int_type(__c));
+ return __ret;
+ }
+ streamsize
+ sputn(const char_type* __s, streamsize __n)
+ { return this->xsputn(__s, __n); }
+ protected:
+ basic_streambuf()
+ : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
+ _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
+ _M_buf_locale(locale())
+ { }
+ char_type*
+ eback() const { return _M_in_beg; }
+ char_type*
+ gptr() const { return _M_in_cur; }
+ char_type*
+ egptr() const { return _M_in_end; }
+ void
+ gbump(int __n) { _M_in_cur += __n; }
+ void
+ setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
+ {
+ _M_in_beg = __gbeg;
+ _M_in_cur = __gnext;
+ _M_in_end = __gend;
+ }
+ char_type*
+ pbase() const { return _M_out_beg; }
+ char_type*
+ pptr() const { return _M_out_cur; }
+ char_type*
+ epptr() const { return _M_out_end; }
+ void
+ pbump(int __n) { _M_out_cur += __n; }
+ void
+ setp(char_type* __pbeg, char_type* __pend)
+ {
+ _M_out_beg = _M_out_cur = __pbeg;
+ _M_out_end = __pend;
+ }
+ virtual void
+ imbue(const locale&)
+ { }
+ virtual basic_streambuf<char_type,_Traits>*
+ setbuf(char_type*, streamsize)
+ { return this; }
+ virtual pos_type
+ seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual pos_type
+ seekpos(pos_type,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual int
+ sync() { return 0; }
+ virtual streamsize
+ showmanyc() { return 0; }
+ virtual streamsize
+ xsgetn(char_type* __s, streamsize __n);
+ virtual int_type
+ underflow()
+ { return traits_type::eof(); }
+ virtual int_type
+ uflow()
+ {
+ int_type __ret = traits_type::eof();
+ const bool __testeof = traits_type::eq_int_type(this->underflow(),
+ __ret);
+ if (!__testeof)
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ return __ret;
+ }
+ virtual int_type
+ pbackfail(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ virtual streamsize
+ xsputn(const char_type* __s, streamsize __n);
+ virtual int_type
+ overflow(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ public:
+ void
+ stossc()
+ {
+ if (this->gptr() < this->egptr())
+ this->gbump(1);
+ else
+ this->uflow();
+ }
+ private:
+ basic_streambuf(const __streambuf_type& __sb)
+ : _M_in_beg(__sb._M_in_beg), _M_in_cur(__sb._M_in_cur),
+ _M_in_end(__sb._M_in_end), _M_out_beg(__sb._M_out_beg),
+ _M_out_cur(__sb._M_out_cur), _M_out_end(__sb._M_out_cur),
+ _M_buf_locale(__sb._M_buf_locale)
+ { }
+ __streambuf_type&
+ operator=(const __streambuf_type&) { return *this; };
+ };
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>* __sbin,
+ basic_streambuf<char>* __sbout, bool& __ineof);
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
+ basic_streambuf<wchar_t>* __sbout, bool& __ineof);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsgetn(char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->egptr() - this->gptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(__s, this->gptr(), __len);
+ __ret += __len;
+ __s += __len;
+ this->gbump(__len);
+ }
+ if (__ret < __n)
+ {
+ const int_type __c = this->uflow();
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ traits_type::assign(*__s++, traits_type::to_char_type(__c));
+ ++__ret;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsputn(const char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->epptr() - this->pptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(this->pptr(), __s, __len);
+ __ret += __len;
+ __s += __len;
+ this->pbump(__len);
+ }
+ if (__ret < __n)
+ {
+ int_type __c = this->overflow(traits_type::to_int_type(*__s));
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ ++__ret;
+ ++__s;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout,
+ bool& __ineof)
+ {
+ streamsize __ret = 0;
+ __ineof = true;
+ typename _Traits::int_type __c = __sbin->sgetc();
+ while (!_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __c = __sbout->sputc(_Traits::to_char_type(__c));
+ if (_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __ineof = false;
+ break;
+ }
+ ++__ret;
+ __c = __sbin->snextc();
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ inline streamsize
+ __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout)
+ {
+ bool __ineof;
+ return __copy_streambufs_eof(__sbin, __sbout, __ineof);
+ }
+ extern template class basic_streambuf<char>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<char>*,
+ basic_streambuf<char>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>*,
+ basic_streambuf<char>*, bool&);
+ extern template class basic_streambuf<wchar_t>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*, bool&);
+}
+
+
+
+extern "C" {
+typedef int wctype_t;
+typedef int wctrans_t;
+int __attribute__((__cdecl__)) iswalpha (wint_t);
+int __attribute__((__cdecl__)) iswalnum (wint_t);
+int __attribute__((__cdecl__)) iswblank (wint_t);
+int __attribute__((__cdecl__)) iswcntrl (wint_t);
+int __attribute__((__cdecl__)) iswctype (wint_t, wctype_t);
+int __attribute__((__cdecl__)) iswdigit (wint_t);
+int __attribute__((__cdecl__)) iswgraph (wint_t);
+int __attribute__((__cdecl__)) iswlower (wint_t);
+int __attribute__((__cdecl__)) iswprint (wint_t);
+int __attribute__((__cdecl__)) iswpunct (wint_t);
+int __attribute__((__cdecl__)) iswspace (wint_t);
+int __attribute__((__cdecl__)) iswupper (wint_t);
+int __attribute__((__cdecl__)) iswxdigit (wint_t);
+wint_t __attribute__((__cdecl__)) towctrans (wint_t, wctrans_t);
+wint_t __attribute__((__cdecl__)) towupper (wint_t);
+wint_t __attribute__((__cdecl__)) towlower (wint_t);
+wctrans_t __attribute__((__cdecl__)) wctrans (const char *);
+wctype_t __attribute__((__cdecl__)) wctype (const char *);
+}
+namespace std {
+ using ::wctrans_t;
+ using ::wctype_t;
+ using ::wint_t;
+ using ::iswalnum;
+ using ::iswalpha;
+ using ::iswblank;
+ using ::iswcntrl;
+ using ::iswctype;
+ using ::iswdigit;
+ using ::iswgraph;
+ using ::iswlower;
+ using ::iswprint;
+ using ::iswpunct;
+ using ::iswspace;
+ using ::iswupper;
+ using ::iswxdigit;
+ using ::towctrans;
+ using ::towlower;
+ using ::towupper;
+ using ::wctrans;
+ using ::wctype;
+}
+
+namespace std {
+ struct ctype_base
+ {
+ typedef const int* __to_type;
+ typedef char mask;
+ static const mask upper = 01;
+ static const mask lower = 02;
+ static const mask alpha = 01 | 02;
+ static const mask digit = 04;
+ static const mask xdigit = 0100 | 04;
+ static const mask space = 010;
+ static const mask print = 020 | 01 | 02 | 04 | 0200;
+ static const mask graph = 020 | 01 | 02 | 04;
+ static const mask cntrl = 040;
+ static const mask punct = 020;
+ static const mask alnum = 01 | 02 | 04;
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator
+ : public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
+ _CharT*, _CharT&>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_istream<_CharT, _Traits> istream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ private:
+ mutable streambuf_type* _M_sbuf;
+ mutable int_type _M_c;
+ public:
+ istreambuf_iterator() throw()
+ : _M_sbuf(0), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(istream_type& __s) throw()
+ : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(streambuf_type* __s) throw()
+ : _M_sbuf(__s), _M_c(traits_type::eof()) { }
+ char_type
+ operator*() const
+ {
+ return traits_type::to_char_type(_M_get());
+ }
+ istreambuf_iterator&
+ operator++()
+ {
+ ;
+ if (_M_sbuf)
+ {
+ _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return *this;
+ }
+ istreambuf_iterator
+ operator++(int)
+ {
+ ;
+ istreambuf_iterator __old = *this;
+ if (_M_sbuf)
+ {
+ __old._M_c = _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return __old;
+ }
+ bool
+ equal(const istreambuf_iterator& __b) const
+ { return _M_at_eof() == __b._M_at_eof(); }
+ private:
+ int_type
+ _M_get() const
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __ret = __eof;
+ if (_M_sbuf)
+ {
+ if (!traits_type::eq_int_type(_M_c, __eof))
+ __ret = _M_c;
+ else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()),
+ __eof))
+ _M_c = __ret;
+ else
+ _M_sbuf = 0;
+ }
+ return __ret;
+ }
+ bool
+ _M_at_eof() const
+ {
+ const int_type __eof = traits_type::eof();
+ return traits_type::eq_int_type(_M_get(), __eof);
+ }
+ };
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return __a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator!=(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return !__a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ private:
+ streambuf_type* _M_sbuf;
+ bool _M_failed;
+ public:
+ ostreambuf_iterator(ostream_type& __s) throw ()
+ : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator(streambuf_type* __s) throw ()
+ : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator&
+ operator=(_CharT __c)
+ {
+ if (!_M_failed &&
+ _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
+ _M_failed = true;
+ return *this;
+ }
+ ostreambuf_iterator&
+ operator*()
+ { return *this; }
+ ostreambuf_iterator&
+ operator++(int)
+ { return *this; }
+ ostreambuf_iterator&
+ operator++()
+ { return *this; }
+ bool
+ failed() const throw()
+ { return _M_failed; }
+ ostreambuf_iterator&
+ _M_put(const _CharT* __ws, streamsize __len)
+ {
+ if (__builtin_expect(!_M_failed, true)
+ && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len,
+ false))
+ _M_failed = true;
+ return *this;
+ }
+ };
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ copy(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed)
+ {
+ bool __ineof;
+ __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof);
+ if (!__ineof)
+ __result._M_failed = true;
+ }
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(_CharT* __first, _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(const _CharT* __first, const _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, _CharT* __result)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ const streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ traits_type::copy(__result, __sb->gptr(), __n);
+ __sb->gbump(__n);
+ __result += __n;
+ __c = __sb->underflow();
+ }
+ else
+ {
+ *__result++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ }
+ }
+ }
+ return __result;
+ }
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ istreambuf_iterator<_CharT> >::__type
+ find(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, const _CharT& __val)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ const int_type __ival = traits_type::to_int_type(__val);
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof())
+ && !traits_type::eq_int_type(__c, __ival))
+ {
+ streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ const _CharT* __p = traits_type::find(__sb->gptr(),
+ __n, __val);
+ if (__p)
+ __n = __p - __sb->gptr();
+ __sb->gbump(__n);
+ __c = __sb->sgetc();
+ }
+ else
+ __c = __sb->snextc();
+ }
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ __first._M_c = __c;
+ else
+ __first._M_sbuf = 0;
+ }
+ return __first;
+ }
+}
+namespace std {
+ template<typename _Tp>
+ void
+ __convert_to_v(const char*, _Tp&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, float&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, long double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<typename _CharT, typename _Traits>
+ struct __pad
+ {
+ static void
+ _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
+ const _CharT* __olds, streamsize __newlen, streamsize __oldlen);
+ };
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last);
+ template<typename _CharT>
+ inline
+ ostreambuf_iterator<_CharT>
+ __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
+ {
+ __s._M_put(__ws, __len);
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ inline
+ _OutIter
+ __write(_OutIter __s, const _CharT* __ws, int __len)
+ {
+ for (int __j = 0; __j < __len; __j++, ++__s)
+ *__s = __ws[__j];
+ return __s;
+ }
+ template<typename _CharT>
+ class __ctype_abstract_base : public locale::facet, public ctype_base
+ {
+ public:
+ typedef _CharT char_type;
+ bool
+ is(mask __m, char_type __c) const
+ { return this->do_is(__m, __c); }
+ const char_type*
+ is(const char_type *__lo, const char_type *__hi, mask *__vec) const
+ { return this->do_is(__lo, __hi, __vec); }
+ const char_type*
+ scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_is(__m, __lo, __hi); }
+ const char_type*
+ scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_not(__m, __lo, __hi); }
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ { return this->do_widen(__c); }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ { return this->do_widen(__lo, __hi, __to); }
+ char
+ narrow(char_type __c, char __dfault) const
+ { return this->do_narrow(__c, __dfault); }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ { return this->do_narrow(__lo, __hi, __dfault, __to); }
+ protected:
+ explicit
+ __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
+ virtual
+ ~__ctype_abstract_base() { }
+ virtual bool
+ do_is(mask __m, char_type __c) const = 0;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi,
+ mask* __vec) const = 0;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual char_type
+ do_toupper(char_type) const = 0;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_tolower(char_type) const = 0;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_widen(char) const = 0;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi,
+ char_type* __dest) const = 0;
+ virtual char
+ do_narrow(char_type, char __dfault) const = 0;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const = 0;
+ };
+ template<typename _CharT>
+ class ctype : public __ctype_abstract_base<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename __ctype_abstract_base<_CharT>::mask mask;
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
+ protected:
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type __c) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type __c) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ };
+ template<typename _CharT>
+ locale::id ctype<_CharT>::id;
+ template<>
+ class ctype<char> : public locale::facet, public ctype_base
+ {
+ public:
+ typedef char char_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_del;
+ __to_type _M_toupper;
+ __to_type _M_tolower;
+ const mask* _M_table;
+ mutable char _M_widen_ok;
+ mutable char _M_widen[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow_ok;
+ public:
+ static locale::id id;
+ static const size_t table_size = 1 + static_cast<unsigned char>(-1);
+ explicit
+ ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
+ size_t __refs = 0);
+ inline bool
+ is(mask __m, char __c) const;
+ inline const char*
+ is(const char* __lo, const char* __hi, mask* __vec) const;
+ inline const char*
+ scan_is(mask __m, const char* __lo, const char* __hi) const;
+ inline const char*
+ scan_not(mask __m, const char* __lo, const char* __hi) const;
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ {
+ if (_M_widen_ok)
+ return _M_widen[static_cast<unsigned char>(__c)];
+ this->_M_widen_init();
+ return this->do_widen(__c);
+ }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ {
+ if (_M_widen_ok == 1)
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_widen_ok)
+ _M_widen_init();
+ return this->do_widen(__lo, __hi, __to);
+ }
+ char
+ narrow(char_type __c, char __dfault) const
+ {
+ if (_M_narrow[static_cast<unsigned char>(__c)])
+ return _M_narrow[static_cast<unsigned char>(__c)];
+ const char __t = do_narrow(__c, __dfault);
+ if (__t != __dfault)
+ _M_narrow[static_cast<unsigned char>(__c)] = __t;
+ return __t;
+ }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ {
+ if (__builtin_expect(_M_narrow_ok == 1, true))
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_narrow_ok)
+ _M_narrow_init();
+ return this->do_narrow(__lo, __hi, __dfault, __to);
+ }
+ const mask*
+ table() const throw()
+ { return _M_table; }
+ static const mask*
+ classic_table() throw();
+ protected:
+ virtual
+ ~ctype();
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const
+ { return __c; }
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ virtual char
+ do_narrow(char_type __c, char) const
+ { return __c; }
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char, char* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ private:
+ void _M_narrow_init() const;
+ void _M_widen_init() const;
+ };
+ template<>
+ class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
+ {
+ public:
+ typedef wchar_t char_type;
+ typedef wctype_t __wmask_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_narrow_ok;
+ char _M_narrow[128];
+ wint_t _M_widen[1 + static_cast<unsigned char>(-1)];
+ mask _M_bit[16];
+ __wmask_type _M_wmask[16];
+ public:
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, size_t __refs = 0);
+ protected:
+ __wmask_type
+ _M_convert_to_wmask(const mask __m) const throw();
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ void
+ _M_initialize_ctype() throw();
+ };
+ template<typename _CharT>
+ class ctype_byname : public ctype<_CharT>
+ {
+ public:
+ typedef typename ctype<_CharT>::mask mask;
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname() { };
+ };
+ template<>
+ class ctype_byname<char> : public ctype<char>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+ template<>
+ class ctype_byname<wchar_t> : public ctype<wchar_t>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+}
+namespace std {
+ bool
+ ctype<char>::
+ is(mask __m, char __c) const
+ { return _M_table[static_cast<unsigned char>(__c)] & __m; }
+ const char*
+ ctype<char>::
+ is(const char* __low, const char* __high, mask* __vec) const
+ {
+ while (__low < __high)
+ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
+ return __high;
+ }
+ const char*
+ ctype<char>::
+ scan_is(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && !this->is(__m, *__low))
+ ++__low;
+ return __low;
+ }
+ const char*
+ ctype<char>::
+ scan_not(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && this->is(__m, *__low) != 0)
+ ++__low;
+ return __low;
+ }
+}
+namespace std {
+ class __num_base
+ {
+ public:
+ enum
+ {
+ _S_ominus,
+ _S_oplus,
+ _S_ox,
+ _S_oX,
+ _S_odigits,
+ _S_odigits_end = _S_odigits + 16,
+ _S_oudigits = _S_odigits_end,
+ _S_oudigits_end = _S_oudigits + 16,
+ _S_oe = _S_odigits + 14,
+ _S_oE = _S_oudigits + 14,
+ _S_oend = _S_oudigits_end
+ };
+ static const char* _S_atoms_out;
+ static const char* _S_atoms_in;
+ enum
+ {
+ _S_iminus,
+ _S_iplus,
+ _S_ix,
+ _S_iX,
+ _S_izero,
+ _S_ie = _S_izero + 14,
+ _S_iE = _S_izero + 20,
+ _S_iend = 26
+ };
+ static void
+ _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw();
+ };
+ template<typename _CharT>
+ struct __numpunct_cache : public locale::facet
+ {
+ const char* _M_grouping;
+ size_t _M_grouping_size;
+ bool _M_use_grouping;
+ const _CharT* _M_truename;
+ size_t _M_truename_size;
+ const _CharT* _M_falsename;
+ size_t _M_falsename_size;
+ _CharT _M_decimal_point;
+ _CharT _M_thousands_sep;
+ _CharT _M_atoms_out[__num_base::_S_oend];
+ _CharT _M_atoms_in[__num_base::_S_iend];
+ bool _M_allocated;
+ __numpunct_cache(size_t __refs = 0) : facet(__refs),
+ _M_grouping(__null), _M_grouping_size(0), _M_use_grouping(false),
+ _M_truename(__null), _M_truename_size(0), _M_falsename(__null),
+ _M_falsename_size(0), _M_decimal_point(_CharT()),
+ _M_thousands_sep(_CharT()), _M_allocated(false)
+ { }
+ ~__numpunct_cache();
+ void
+ _M_cache(const locale& __loc);
+ private:
+ __numpunct_cache&
+ operator=(const __numpunct_cache&);
+ explicit
+ __numpunct_cache(const __numpunct_cache&);
+ };
+ template<typename _CharT>
+ __numpunct_cache<_CharT>::~__numpunct_cache()
+ {
+ if (_M_allocated)
+ {
+ delete [] _M_grouping;
+ delete [] _M_truename;
+ delete [] _M_falsename;
+ }
+ }
+ template<typename _CharT>
+ class numpunct : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ protected:
+ __cache_type* _M_data;
+ public:
+ static locale::id id;
+ explicit
+ numpunct(size_t __refs = 0) : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__cache_type* __cache, size_t __refs = 0)
+ : facet(__refs), _M_data(__cache)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(__cloc); }
+ char_type
+ decimal_point() const
+ { return this->do_decimal_point(); }
+ char_type
+ thousands_sep() const
+ { return this->do_thousands_sep(); }
+ string
+ grouping() const
+ { return this->do_grouping(); }
+ string_type
+ truename() const
+ { return this->do_truename(); }
+ string_type
+ falsename() const
+ { return this->do_falsename(); }
+ protected:
+ virtual
+ ~numpunct();
+ virtual char_type
+ do_decimal_point() const
+ { return _M_data->_M_decimal_point; }
+ virtual char_type
+ do_thousands_sep() const
+ { return _M_data->_M_thousands_sep; }
+ virtual string
+ do_grouping() const
+ { return _M_data->_M_grouping; }
+ virtual string_type
+ do_truename() const
+ { return _M_data->_M_truename; }
+ virtual string_type
+ do_falsename() const
+ { return _M_data->_M_falsename; }
+ void
+ _M_initialize_numpunct(__c_locale __cloc = __null);
+ };
+ template<typename _CharT>
+ locale::id numpunct<_CharT>::id;
+ template<>
+ numpunct<char>::~numpunct();
+ template<>
+ void
+ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
+ template<>
+ numpunct<wchar_t>::~numpunct();
+ template<>
+ void
+ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
+ template<typename _CharT>
+ class numpunct_byname : public numpunct<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ numpunct_byname(const char* __s, size_t __refs = 0)
+ : numpunct<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ __c_locale __tmp;
+ this->_S_create_c_locale(__tmp, __s);
+ this->_M_initialize_numpunct(__tmp);
+ this->_S_destroy_c_locale(__tmp);
+ }
+ }
+ protected:
+ virtual
+ ~numpunct_byname() { }
+ };
+
+ template<typename _CharT, typename _InIter>
+ class num_get : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _InIter iter_type;
+ static locale::id id;
+ explicit
+ num_get(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ protected:
+ virtual ~num_get() { }
+ iter_type
+ _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ string&) const;
+ template<typename _ValueT>
+ iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ _ValueT&) const;
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
+ _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ if (__len <= 10)
+ {
+ if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
+ __ret = __c - _CharT2('0');
+ }
+ else
+ {
+ if (__c >= _CharT2('0') && __c <= _CharT2('9'))
+ __ret = __c - _CharT2('0');
+ else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
+ __ret = 10 + (__c - _CharT2('a'));
+ else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
+ __ret = 10 + (__c - _CharT2('A'));
+ }
+ return __ret;
+ }
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
+ int>::__type
+ _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
+ if (__q)
+ {
+ __ret = __q - __zero;
+ if (__ret > 15)
+ __ret -= 6;
+ }
+ return __ret;
+ }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ float&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ long double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ void*&) const;
+ };
+ template<typename _CharT, typename _InIter>
+ locale::id num_get<_CharT, _InIter>::id;
+ template<typename _CharT, typename _OutIter>
+ class num_put : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _OutIter iter_type;
+ static locale::id id;
+ explicit
+ num_put(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ long double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ const void* __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ protected:
+ template<typename _ValueT>
+ iter_type
+ _M_insert_float(iter_type, ios_base& __io, char_type __fill,
+ char __mod, _ValueT __v) const;
+ void
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ char_type __sep, const char_type* __p, char_type* __new,
+ char_type* __cs, int& __len) const;
+ template<typename _ValueT>
+ iter_type
+ _M_insert_int(iter_type, ios_base& __io, char_type __fill,
+ _ValueT __v) const;
+ void
+ _M_group_int(const char* __grouping, size_t __grouping_size,
+ char_type __sep, ios_base& __io, char_type* __new,
+ char_type* __cs, int& __len) const;
+ void
+ _M_pad(char_type __fill, streamsize __w, ios_base& __io,
+ char_type* __new, const char_type* __cs, int& __len) const;
+ virtual
+ ~num_put() { };
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
+ };
+ template <typename _CharT, typename _OutIter>
+ locale::id num_put<_CharT, _OutIter>::id;
+
+ template<typename _CharT>
+ inline bool
+ isspace(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
+ template<typename _CharT>
+ inline bool
+ isprint(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
+ template<typename _CharT>
+ inline bool
+ iscntrl(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
+ template<typename _CharT>
+ inline bool
+ isupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
+ template<typename _CharT>
+ inline bool
+ islower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
+ template<typename _CharT>
+ inline bool
+ isalpha(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
+ template<typename _CharT>
+ inline bool
+ isdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
+ template<typename _CharT>
+ inline bool
+ ispunct(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
+ template<typename _CharT>
+ inline bool
+ isxdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
+ template<typename _CharT>
+ inline bool
+ isalnum(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
+ template<typename _CharT>
+ inline bool
+ isgraph(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
+ template<typename _CharT>
+ inline _CharT
+ toupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
+ template<typename _CharT>
+ inline _CharT
+ tolower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
+}
+
+namespace std {
+ template<typename _Facet>
+ struct __use_cache
+ {
+ const _Facet*
+ operator() (const locale& __loc) const;
+ };
+ template<typename _CharT>
+ struct __use_cache<__numpunct_cache<_CharT> >
+ {
+ const __numpunct_cache<_CharT>*
+ operator() (const locale& __loc) const
+ {
+ const size_t __i = numpunct<_CharT>::id._M_id();
+ const locale::facet** __caches = __loc._M_impl->_M_caches;
+ if (!__caches[__i])
+ {
+ __numpunct_cache<_CharT>* __tmp = __null;
+ try
+ {
+ __tmp = new __numpunct_cache<_CharT>;
+ __tmp->_M_cache(__loc);
+ }
+ catch(...)
+ {
+ delete __tmp;
+ throw;
+ }
+ __loc._M_impl->_M_install_cache(__tmp, __i);
+ }
+ return static_cast<const __numpunct_cache<_CharT>*>(__caches[__i]);
+ }
+ };
+ template<typename _CharT>
+ void
+ __numpunct_cache<_CharT>::_M_cache(const locale& __loc)
+ {
+ _M_allocated = true;
+ const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
+ char* __grouping = 0;
+ _CharT* __truename = 0;
+ _CharT* __falsename = 0;
+ try
+ {
+ _M_grouping_size = __np.grouping().size();
+ __grouping = new char[_M_grouping_size];
+ __np.grouping().copy(__grouping, _M_grouping_size);
+ _M_grouping = __grouping;
+ _M_use_grouping = (_M_grouping_size
+ && static_cast<signed char>(_M_grouping[0]) > 0
+ && (_M_grouping[0]
+ != __gnu_cxx::__numeric_traits<char>::__max));
+ _M_truename_size = __np.truename().size();
+ __truename = new _CharT[_M_truename_size];
+ __np.truename().copy(__truename, _M_truename_size);
+ _M_truename = __truename;
+ _M_falsename_size = __np.falsename().size();
+ __falsename = new _CharT[_M_falsename_size];
+ __np.falsename().copy(__falsename, _M_falsename_size);
+ _M_falsename = __falsename;
+ _M_decimal_point = __np.decimal_point();
+ _M_thousands_sep = __np.thousands_sep();
+ const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
+ __ct.widen(__num_base::_S_atoms_out,
+ __num_base::_S_atoms_out
+ + __num_base::_S_oend, _M_atoms_out);
+ __ct.widen(__num_base::_S_atoms_in,
+ __num_base::_S_atoms_in
+ + __num_base::_S_iend, _M_atoms_in);
+ }
+ catch(...)
+ {
+ delete [] __grouping;
+ delete [] __truename;
+ delete [] __falsename;
+ throw;
+ }
+ }
+ __attribute__ ((__pure__)) bool
+ __verify_grouping(const char* __grouping, size_t __grouping_size,
+ const string& __grouping_tmp) throw ();
+
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_float(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, string& __xtrc) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ bool __testeof = __beg == __end;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ __xtrc += __plus ? '+' : '-';
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_mantissa = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero])
+ {
+ if (!__found_mantissa)
+ {
+ __xtrc += '0';
+ __found_mantissa = true;
+ }
+ ++__sep_pos;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ break;
+ }
+ bool __found_dec = false;
+ bool __found_sci = false;
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ const int __digit = _M_find(__lit_zero, 10, __c);
+ if (__digit != -1)
+ {
+ __xtrc += '0' + __digit;
+ __found_mantissa = true;
+ }
+ else if (__c == __lc->_M_decimal_point
+ && !__found_dec && !__found_sci)
+ {
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if (__plus || __c == __lit[__num_base::_S_iminus])
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __xtrc.clear();
+ break;
+ }
+ }
+ else
+ break;
+ }
+ else if (__c == __lc->_M_decimal_point)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__found_grouping.size())
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else
+ break;
+ }
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, 10, __c);
+ if (__q)
+ {
+ __xtrc += '0' + (__q - __lit_zero);
+ __found_mantissa = true;
+ ++__sep_pos;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ if (__found_grouping.size() && !__found_dec)
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping
+ && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ if (!__found_dec && !__found_sci)
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ template<typename _ValueT>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, _ValueT& __v) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ const ios_base::fmtflags __basefield = __io.flags()
+ & ios_base::basefield;
+ const bool __oct = __basefield == ios_base::oct;
+ int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);
+ bool __testeof = __beg == __end;
+ bool __negative = false;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ __negative = __c == __lit[__num_base::_S_iminus];
+ if ((__negative || __c == __lit[__num_base::_S_iplus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_zero = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero]
+ && (!__found_zero || __base == 10))
+ {
+ __found_zero = true;
+ ++__sep_pos;
+ if (__basefield == 0)
+ __base = 8;
+ if (__base == 8)
+ __sep_pos = 0;
+ }
+ else if (__found_zero
+ && (__c == __lit[__num_base::_S_ix]
+ || __c == __lit[__num_base::_S_iX]))
+ {
+ if (__basefield == 0)
+ __base = 16;
+ if (__base == 16)
+ {
+ __found_zero = false;
+ __sep_pos = 0;
+ }
+ else
+ break;
+ }
+ else
+ break;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ if (!__found_zero)
+ break;
+ }
+ else
+ __testeof = true;
+ }
+ const size_t __len = (__base == 16 ? __num_base::_S_iend
+ - __num_base::_S_izero : __base);
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ bool __testfail = false;
+ bool __testoverflow = false;
+ const __unsigned_type __max =
+ (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ ? -__gnu_cxx::__numeric_traits<_ValueT>::__min
+ : __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ const __unsigned_type __smax = __max / __base;
+ __unsigned_type __result = 0;
+ int __digit = 0;
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ __digit = _M_find(__lit_zero, __len, __c);
+ if (__digit == -1)
+ break;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __testfail = true;
+ break;
+ }
+ }
+ else if (__c == __lc->_M_decimal_point)
+ break;
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, __len, __c);
+ if (!__q)
+ break;
+ __digit = __q - __lit_zero;
+ if (__digit > 15)
+ __digit -= 6;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ if ((!__sep_pos && !__found_zero && !__found_grouping.size())
+ || __testfail)
+ {
+ __v = 0;
+ __err = ios_base::failbit;
+ }
+ else if (__testoverflow)
+ {
+ if (__negative
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__min;
+ else
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ __err = ios_base::failbit;
+ }
+ else
+ __v = __negative ? -__result : __result;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ {
+ if (!(__io.flags() & ios_base::boolalpha))
+ {
+ long __l = -1;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __l);
+ if (__l == 0 || __l == 1)
+ __v = bool(__l);
+ else
+ {
+ __v = true;
+ __err = ios_base::failbit;
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ }
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ bool __testf = true;
+ bool __testt = true;
+ bool __donef = __lc->_M_falsename_size == 0;
+ bool __donet = __lc->_M_truename_size == 0;
+ bool __testeof = false;
+ size_t __n = 0;
+ while (!__donef || !__donet)
+ {
+ if (__beg == __end)
+ {
+ __testeof = true;
+ break;
+ }
+ const char_type __c = *__beg;
+ if (!__donef)
+ __testf = __c == __lc->_M_falsename[__n];
+ if (!__testf && __donet)
+ break;
+ if (!__donet)
+ __testt = __c == __lc->_M_truename[__n];
+ if (!__testt && __donef)
+ break;
+ if (!__testt && !__testf)
+ break;
+ ++__n;
+ ++__beg;
+ __donef = !__testf || __n >= __lc->_M_falsename_size;
+ __donet = !__testt || __n >= __lc->_M_truename_size;
+ }
+ if (__testf && __n == __lc->_M_falsename_size && __n)
+ {
+ __v = false;
+ if (__testt && __n == __lc->_M_truename_size)
+ __err = ios_base::failbit;
+ else
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else if (__testt && __n == __lc->_M_truename_size && __n)
+ {
+ __v = true;
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else
+ {
+ __v = false;
+ __err = ios_base::failbit;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ }
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ {
+ typedef ios_base::fmtflags fmtflags;
+ const fmtflags __fmt = __io.flags();
+ __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex);
+ typedef __gnu_cxx::__conditional_type<(sizeof(void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ _UIntPtrType __ul;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
+ __io.flags(__fmt);
+ __v = reinterpret_cast<void*>(__ul);
+ return __beg;
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_pad(_CharT __fill, streamsize __w, ios_base& __io,
+ _CharT* __new, const _CharT* __cs, int& __len) const
+ {
+ __pad<_CharT, char_traits<_CharT> >::_S_pad(__io, __fill, __new,
+ __cs, __w, __len);
+ __len = static_cast<int>(__w);
+ }
+
+ template<typename _CharT, typename _ValueT>
+ int
+ __int_to_char(_CharT* __bufend, _ValueT __v, const _CharT* __lit,
+ ios_base::fmtflags __flags, bool __dec)
+ {
+ _CharT* __buf = __bufend;
+ if (__builtin_expect(__dec, true))
+ {
+ do
+ {
+ *--__buf = __lit[(__v % 10) + __num_base::_S_odigits];
+ __v /= 10;
+ }
+ while (__v != 0);
+ }
+ else if ((__flags & ios_base::basefield) == ios_base::oct)
+ {
+ do
+ {
+ *--__buf = __lit[(__v & 0x7) + __num_base::_S_odigits];
+ __v >>= 3;
+ }
+ while (__v != 0);
+ }
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ const int __case_offset = __uppercase ? __num_base::_S_oudigits
+ : __num_base::_S_odigits;
+ do
+ {
+ *--__buf = __lit[(__v & 0xf) + __case_offset];
+ __v >>= 4;
+ }
+ while (__v != 0);
+ }
+ return __bufend - __buf;
+ }
+
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_int(const char* __grouping, size_t __grouping_size, _CharT __sep,
+ ios_base&, _CharT* __new, _CharT* __cs, int& __len) const
+ {
+ _CharT* __p = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size, __cs, __cs + __len);
+ __len = __p - __new;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
+ _ValueT __v) const
+ {
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_out;
+ const ios_base::fmtflags __flags = __io.flags();
+ const int __ilen = 5 * sizeof(_ValueT);
+ _CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __ilen));
+ const ios_base::fmtflags __basefield = __flags & ios_base::basefield;
+ const bool __dec = (__basefield != ios_base::oct
+ && __basefield != ios_base::hex);
+ const __unsigned_type __u = ((__v > 0 || !__dec)
+ ? __unsigned_type(__v)
+ : -__unsigned_type(__v));
+ int __len = __int_to_char(__cs + __ilen, __u, __lit, __flags, __dec);
+ __cs += __ilen - __len;
+ if (__lc->_M_use_grouping)
+ {
+ _CharT* __cs2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * (__len + 1)
+ * 2));
+ _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __io, __cs2 + 2, __cs, __len);
+ __cs = __cs2 + 2;
+ }
+ if (__builtin_expect(__dec, true))
+ {
+ if (__v >= 0)
+ {
+ if (bool(__flags & ios_base::showpos)
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ *--__cs = __lit[__num_base::_S_oplus], ++__len;
+ }
+ else
+ *--__cs = __lit[__num_base::_S_ominus], ++__len;
+ }
+ else if (bool(__flags & ios_base::showbase) && __v)
+ {
+ if (__basefield == ios_base::oct)
+ *--__cs = __lit[__num_base::_S_odigits], ++__len;
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ *--__cs = __lit[__num_base::_S_ox + __uppercase];
+ *--__cs = __lit[__num_base::_S_odigits];
+ __len += 2;
+ }
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __cs3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __cs3, __cs, __len);
+ __cs = __cs3;
+ }
+ __io.width(0);
+ return std::__write(__s, __cs, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ _CharT __sep, const _CharT* __p, _CharT* __new,
+ _CharT* __cs, int& __len) const
+ {
+ const int __declen = __p ? __p - __cs : __len;
+ _CharT* __p2 = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size,
+ __cs, __cs + __declen);
+ int __newlen = __p2 - __new;
+ if (__p)
+ {
+ char_traits<_CharT>::copy(__p2, __p, __len - __declen);
+ __newlen += __len - __declen;
+ }
+ __len = __newlen;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
+ _ValueT __v) const
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const streamsize __prec = __io.precision() < 0 ? 6 : __io.precision();
+ const int __max_digits =
+ __gnu_cxx::__numeric_traits<_ValueT>::__digits10;
+ int __len;
+ char __fbuf[16];
+ __num_base::_S_format_float(__io, __fbuf, __mod);
+ const bool __fixed = __io.flags() & ios_base::fixed;
+ const int __max_exp =
+ __gnu_cxx::__numeric_traits<_ValueT>::__max_exponent10;
+ const int __cs_size = __fixed ? __max_exp + __prec + 4
+ : __max_digits * 2 + __prec;
+ char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
+ __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, __fbuf,
+ __prec, __v);
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len));
+ __ctype.widen(__cs, __cs + __len, __ws);
+ _CharT* __wp = 0;
+ const char* __p = char_traits<char>::find(__cs, __len, '.');
+ if (__p)
+ {
+ __wp = __ws + (__p - __cs);
+ *__wp = __lc->_M_decimal_point;
+ }
+ if (__lc->_M_use_grouping
+ && (__wp || __len < 3 || (__cs[1] <= '9' && __cs[2] <= '9'
+ && __cs[1] >= '0' && __cs[2] >= '0')))
+ {
+ _CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len * 2));
+ streamsize __off = 0;
+ if (__cs[0] == '-' || __cs[0] == '+')
+ {
+ __off = 1;
+ __ws2[0] = __ws[0];
+ __len -= 1;
+ }
+ _M_group_float(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __wp, __ws2 + __off,
+ __ws + __off, __len);
+ __len += __off;
+ __ws = __ws2;
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __ws3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __ws3, __ws, __len);
+ __ws = __ws3;
+ }
+ __io.width(0);
+ return std::__write(__s, __ws, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ if ((__flags & ios_base::boolalpha) == 0)
+ {
+ const long __l = __v;
+ __s = _M_insert_int(__s, __io, __fill, __l);
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __name = __v ? __lc->_M_truename
+ : __lc->_M_falsename;
+ int __len = __v ? __lc->_M_truename_size
+ : __lc->_M_falsename_size;
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ const streamsize __plen = __w - __len;
+ _CharT* __ps
+ = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __plen));
+ char_traits<_CharT>::assign(__ps, __plen, __fill);
+ __io.width(0);
+ if ((__flags & ios_base::adjustfield) == ios_base::left)
+ {
+ __s = std::__write(__s, __name, __len);
+ __s = std::__write(__s, __ps, __plen);
+ }
+ else
+ {
+ __s = std::__write(__s, __ps, __plen);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ __io.width(0);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
+ { return _M_insert_float(__s, __io, __fill, char(), __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long double __v) const
+ { return _M_insert_float(__s, __io, __fill, 'L', __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ const void* __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ const ios_base::fmtflags __fmt = ~(ios_base::basefield
+ | ios_base::uppercase);
+ __io.flags((__flags & __fmt) | (ios_base::hex | ios_base::showbase));
+ typedef __gnu_cxx::__conditional_type<(sizeof(const void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ __s = _M_insert_int(__s, __io, __fill,
+ reinterpret_cast<_UIntPtrType>(__v));
+ __io.flags(__flags);
+ return __s;
+ }
+
+ template<typename _CharT, typename _Traits>
+ void
+ __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill,
+ _CharT* __news, const _CharT* __olds,
+ streamsize __newlen, streamsize __oldlen)
+ {
+ const size_t __plen = static_cast<size_t>(__newlen - __oldlen);
+ const ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;
+ if (__adjust == ios_base::left)
+ {
+ _Traits::copy(__news, __olds, __oldlen);
+ _Traits::assign(__news + __oldlen, __plen, __fill);
+ return;
+ }
+ size_t __mod = 0;
+ if (__adjust == ios_base::internal)
+ {
+ const locale& __loc = __io._M_getloc();
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ if (__ctype.widen('-') == __olds[0]
+ || __ctype.widen('+') == __olds[0])
+ {
+ __news[0] = __olds[0];
+ __mod = 1;
+ ++__news;
+ }
+ else if (__ctype.widen('0') == __olds[0]
+ && __oldlen > 1
+ && (__ctype.widen('x') == __olds[1]
+ || __ctype.widen('X') == __olds[1]))
+ {
+ __news[0] = __olds[0];
+ __news[1] = __olds[1];
+ __mod = 2;
+ __news += 2;
+ }
+ }
+ _Traits::assign(__news, __plen, __fill);
+ _Traits::copy(__news + __plen, __olds + __mod, __oldlen - __mod);
+ }
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last)
+ {
+ size_t __idx = 0;
+ size_t __ctr = 0;
+ while (__last - __first > __gbeg[__idx]
+ && static_cast<signed char>(__gbeg[__idx]) > 0
+ && __gbeg[__idx] != __gnu_cxx::__numeric_traits<char>::__max)
+ {
+ __last -= __gbeg[__idx];
+ __idx < __gsize - 1 ? ++__idx : ++__ctr;
+ }
+ while (__first != __last)
+ *__s++ = *__first++;
+ while (__ctr--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ while (__idx--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ return __s;
+ }
+ extern template class numpunct<char>;
+ extern template class numpunct_byname<char>;
+ extern template class num_get<char>;
+ extern template class num_put<char>;
+ extern template class ctype_byname<char>;
+ extern template
+ const ctype<char>&
+ use_facet<ctype<char> >(const locale&);
+ extern template
+ const numpunct<char>&
+ use_facet<numpunct<char> >(const locale&);
+ extern template
+ const num_put<char>&
+ use_facet<num_put<char> >(const locale&);
+ extern template
+ const num_get<char>&
+ use_facet<num_get<char> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<char> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<char> >(const locale&);
+ extern template class numpunct<wchar_t>;
+ extern template class numpunct_byname<wchar_t>;
+ extern template class num_get<wchar_t>;
+ extern template class num_put<wchar_t>;
+ extern template class ctype_byname<wchar_t>;
+ extern template
+ const ctype<wchar_t>&
+ use_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ const numpunct<wchar_t>&
+ use_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ const num_put<wchar_t>&
+ use_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ const num_get<wchar_t>&
+ use_facet<num_get<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<wchar_t> >(const locale&);
+}
+namespace std {
+ template<typename _Facet>
+ inline const _Facet&
+ __check_facet(const _Facet* __f)
+ {
+ if (!__f)
+ __throw_bad_cast();
+ return *__f;
+ }
+ template<typename _CharT, typename _Traits>
+ class basic_ios : public ios_base
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ protected:
+ basic_ostream<_CharT, _Traits>* _M_tie;
+ mutable char_type _M_fill;
+ mutable bool _M_fill_init;
+ basic_streambuf<_CharT, _Traits>* _M_streambuf;
+ const __ctype_type* _M_ctype;
+ const __num_put_type* _M_num_put;
+ const __num_get_type* _M_num_get;
+ public:
+ operator void*() const
+ { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
+ bool
+ operator!() const
+ { return this->fail(); }
+ iostate
+ rdstate() const
+ { return _M_streambuf_state; }
+ void
+ clear(iostate __state = goodbit);
+ void
+ setstate(iostate __state)
+ { this->clear(this->rdstate() | __state); }
+ void
+ _M_setstate(iostate __state)
+ {
+ _M_streambuf_state |= __state;
+ if (this->exceptions() & __state)
+ throw;
+ }
+ bool
+ good() const
+ { return this->rdstate() == 0; }
+ bool
+ eof() const
+ { return (this->rdstate() & eofbit) != 0; }
+ bool
+ fail() const
+ { return (this->rdstate() & (badbit | failbit)) != 0; }
+ bool
+ bad() const
+ { return (this->rdstate() & badbit) != 0; }
+ iostate
+ exceptions() const
+ { return _M_exception; }
+ void
+ exceptions(iostate __except)
+ {
+ _M_exception = __except;
+ this->clear(_M_streambuf_state);
+ }
+ explicit
+ basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
+ : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
+ _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { this->init(__sb); }
+ virtual
+ ~basic_ios() { }
+ basic_ostream<_CharT, _Traits>*
+ tie() const
+ { return _M_tie; }
+ basic_ostream<_CharT, _Traits>*
+ tie(basic_ostream<_CharT, _Traits>* __tiestr)
+ {
+ basic_ostream<_CharT, _Traits>* __old = _M_tie;
+ _M_tie = __tiestr;
+ return __old;
+ }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf() const
+ { return _M_streambuf; }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
+ basic_ios&
+ copyfmt(const basic_ios& __rhs);
+ char_type
+ fill() const
+ {
+ if (!_M_fill_init)
+ {
+ _M_fill = this->widen(' ');
+ _M_fill_init = true;
+ }
+ return _M_fill;
+ }
+ char_type
+ fill(char_type __ch)
+ {
+ char_type __old = this->fill();
+ _M_fill = __ch;
+ return __old;
+ }
+ locale
+ imbue(const locale& __loc);
+ char
+ narrow(char_type __c, char __dfault) const
+ { return __check_facet(_M_ctype).narrow(__c, __dfault); }
+ char_type
+ widen(char __c) const
+ { return __check_facet(_M_ctype).widen(__c); }
+ protected:
+ basic_ios()
+ : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
+ _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { }
+ void
+ init(basic_streambuf<_CharT, _Traits>* __sb);
+ void
+ _M_cache_locale(const locale& __loc);
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::clear(iostate __state)
+ {
+ if (this->rdbuf())
+ _M_streambuf_state = __state;
+ else
+ _M_streambuf_state = __state | badbit;
+ if (this->exceptions() & this->rdstate())
+ __throw_ios_failure(("basic_ios::clear"));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_streambuf<_CharT, _Traits>*
+ basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ basic_streambuf<_CharT, _Traits>* __old = _M_streambuf;
+ _M_streambuf = __sb;
+ this->clear();
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ios<_CharT, _Traits>&
+ basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
+ {
+ if (this != &__rhs)
+ {
+ _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ?
+ _M_local_word : new _Words[__rhs._M_word_size];
+ _Callback_list* __cb = __rhs._M_callbacks;
+ if (__cb)
+ __cb->_M_add_reference();
+ _M_call_callbacks(erase_event);
+ if (_M_word != _M_local_word)
+ {
+ delete [] _M_word;
+ _M_word = 0;
+ }
+ _M_dispose_callbacks();
+ _M_callbacks = __cb;
+ for (int __i = 0; __i < __rhs._M_word_size; ++__i)
+ __words[__i] = __rhs._M_word[__i];
+ _M_word = __words;
+ _M_word_size = __rhs._M_word_size;
+ this->flags(__rhs.flags());
+ this->width(__rhs.width());
+ this->precision(__rhs.precision());
+ this->tie(__rhs.tie());
+ this->fill(__rhs.fill());
+ _M_ios_locale = __rhs.getloc();
+ _M_cache_locale(_M_ios_locale);
+ _M_call_callbacks(copyfmt_event);
+ this->exceptions(__rhs.exceptions());
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ locale
+ basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
+ {
+ locale __old(this->getloc());
+ ios_base::imbue(__loc);
+ _M_cache_locale(__loc);
+ if (this->rdbuf() != 0)
+ this->rdbuf()->pubimbue(__loc);
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ ios_base::_M_init();
+ _M_cache_locale(_M_ios_locale);
+ _M_fill = _CharT();
+ _M_fill_init = false;
+ _M_tie = 0;
+ _M_exception = goodbit;
+ _M_streambuf = __sb;
+ _M_streambuf_state = __sb ? goodbit : badbit;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc)
+ {
+ if (__builtin_expect(has_facet<__ctype_type>(__loc), true))
+ _M_ctype = &use_facet<__ctype_type>(__loc);
+ else
+ _M_ctype = 0;
+ if (__builtin_expect(has_facet<__num_put_type>(__loc), true))
+ _M_num_put = &use_facet<__num_put_type>(__loc);
+ else
+ _M_num_put = 0;
+ if (__builtin_expect(has_facet<__num_get_type>(__loc), true))
+ _M_num_get = &use_facet<__num_get_type>(__loc);
+ else
+ _M_num_get = 0;
+ }
+ extern template class basic_ios<char>;
+ extern template class basic_ios<wchar_t>;
+}
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef ctype<_CharT> __ctype_type;
+ explicit
+ basic_ostream(__streambuf_type* __sb)
+ { this->init(__sb); }
+ virtual
+ ~basic_ostream() { }
+ class sentry;
+ friend class sentry;
+ __ostream_type&
+ operator<<(__ostream_type& (*__pf)(__ostream_type&))
+ {
+ return __pf(*this);
+ }
+ __ostream_type&
+ operator<<(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(ios_base& (*__pf) (ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(bool __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(short __n);
+ __ostream_type&
+ operator<<(unsigned short __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(int __n);
+ __ostream_type&
+ operator<<(unsigned int __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(float __f)
+ {
+ return _M_insert(static_cast<double>(__f));
+ }
+ __ostream_type&
+ operator<<(long double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(const void* __p)
+ { return _M_insert(__p); }
+ __ostream_type&
+ operator<<(__streambuf_type* __sb);
+ __ostream_type&
+ put(char_type __c);
+ void
+ _M_write(const char_type* __s, streamsize __n)
+ {
+ const streamsize __put = this->rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ this->setstate(ios_base::badbit);
+ }
+ __ostream_type&
+ write(const char_type* __s, streamsize __n);
+ __ostream_type&
+ flush();
+ pos_type
+ tellp();
+ __ostream_type&
+ seekp(pos_type);
+ __ostream_type&
+ seekp(off_type, ios_base::seekdir);
+ protected:
+ basic_ostream()
+ { this->init(0); }
+ template<typename _ValueT>
+ __ostream_type&
+ _M_insert(_ValueT __v);
+ };
+ template <typename _CharT, typename _Traits>
+ class basic_ostream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ basic_ostream<_CharT, _Traits>& _M_os;
+ public:
+ explicit
+ sentry(basic_ostream<_CharT, _Traits>& __os);
+ ~sentry()
+ {
+ if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
+ {
+ if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
+ _M_os.setstate(ios_base::badbit);
+ }
+ }
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
+ { return (__out << __out.widen(__c)); }
+ template <class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, char __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits> &
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits> &
+ operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ endl(basic_ostream<_CharT, _Traits>& __os)
+ { return flush(__os.put(__os.widen('\n'))); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ ends(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.put(_CharT()); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ flush(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.flush(); }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>::sentry::
+ sentry(basic_ostream<_CharT, _Traits>& __os)
+ : _M_ok(false), _M_os(__os)
+ {
+ if (__os.tie() && __os.good())
+ __os.tie()->flush();
+ if (__os.good())
+ _M_ok = true;
+ else
+ __os.setstate(ios_base::failbit);
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ _M_insert(_ValueT __v)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_put_type& __np = __check_facet(this->_M_num_put);
+ if (__np.put(*this, *this, this->fill(), __v).failed())
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(short __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(int __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(__streambuf_type* __sbin)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this);
+ if (__cerb && __sbin)
+ {
+ try
+ {
+ if (!__copy_streambufs(__sbin, this->rdbuf()))
+ __err |= ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbin)
+ __err |= ios_base::badbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ put(char_type __c)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __put = this->rdbuf()->sputc(__c);
+ if (traits_type::eq_int_type(__put, traits_type::eof()))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ write(const _CharT* __s, streamsize __n)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ try
+ { _M_write(__s, __n); }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ flush()
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_ostream<_CharT, _Traits>::pos_type
+ basic_ostream<_CharT, _Traits>::
+ tellp()
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ {
+ const size_t __clen = char_traits<char>::length(__s);
+ try
+ {
+ struct __ptr_guard
+ {
+ _CharT *__p;
+ __ptr_guard (_CharT *__ip): __p(__ip) { }
+ ~__ptr_guard() { delete[] __p; }
+ _CharT* __get() { return __p; }
+ } __pg (new _CharT[__clen]);
+ _CharT *__ws = __pg.__get();
+ for (size_t __i = 0; __i < __clen; ++__i)
+ __ws[__i] = __out.widen(__s[__i]);
+ __ostream_insert(__out, __ws, __clen);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template class basic_ostream<char>;
+ extern template ostream& endl(ostream&);
+ extern template ostream& ends(ostream&);
+ extern template ostream& flush(ostream&);
+ extern template ostream& operator<<(ostream&, char);
+ extern template ostream& operator<<(ostream&, unsigned char);
+ extern template ostream& operator<<(ostream&, signed char);
+ extern template ostream& operator<<(ostream&, const char*);
+ extern template ostream& operator<<(ostream&, const unsigned char*);
+ extern template ostream& operator<<(ostream&, const signed char*);
+ extern template ostream& ostream::_M_insert(long);
+ extern template ostream& ostream::_M_insert(unsigned long);
+ extern template ostream& ostream::_M_insert(bool);
+ extern template ostream& ostream::_M_insert(long long);
+ extern template ostream& ostream::_M_insert(unsigned long long);
+ extern template ostream& ostream::_M_insert(double);
+ extern template ostream& ostream::_M_insert(long double);
+ extern template ostream& ostream::_M_insert(const void*);
+ extern template class basic_ostream<wchar_t>;
+ extern template wostream& endl(wostream&);
+ extern template wostream& ends(wostream&);
+ extern template wostream& flush(wostream&);
+ extern template wostream& operator<<(wostream&, wchar_t);
+ extern template wostream& operator<<(wostream&, char);
+ extern template wostream& operator<<(wostream&, const wchar_t*);
+ extern template wostream& operator<<(wostream&, const char*);
+ extern template wostream& wostream::_M_insert(long);
+ extern template wostream& wostream::_M_insert(unsigned long);
+ extern template wostream& wostream::_M_insert(bool);
+ extern template wostream& wostream::_M_insert(long long);
+ extern template wostream& wostream::_M_insert(unsigned long long);
+ extern template wostream& wostream::_M_insert(double);
+ extern template wostream& wostream::_M_insert(long double);
+ extern template wostream& wostream::_M_insert(const void*);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_istream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ typedef ctype<_CharT> __ctype_type;
+ protected:
+ streamsize _M_gcount;
+ public:
+ explicit
+ basic_istream(__streambuf_type* __sb)
+ : _M_gcount(streamsize(0))
+ { this->init(__sb); }
+ virtual
+ ~basic_istream()
+ { _M_gcount = streamsize(0); }
+ class sentry;
+ friend class sentry;
+ __istream_type&
+ operator>>(__istream_type& (*__pf)(__istream_type&))
+ { return __pf(*this); }
+ __istream_type&
+ operator>>(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(ios_base& (*__pf)(ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(bool& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(short& __n);
+ __istream_type&
+ operator>>(unsigned short& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(int& __n);
+ __istream_type&
+ operator>>(unsigned int& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(float& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(long double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(void*& __p)
+ { return _M_extract(__p); }
+ __istream_type&
+ operator>>(__streambuf_type* __sb);
+ streamsize
+ gcount() const
+ { return _M_gcount; }
+ int_type
+ get();
+ __istream_type&
+ get(char_type& __c);
+ __istream_type&
+ get(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ get(char_type* __s, streamsize __n)
+ { return this->get(__s, __n, this->widen('\n')); }
+ __istream_type&
+ get(__streambuf_type& __sb, char_type __delim);
+ __istream_type&
+ get(__streambuf_type& __sb)
+ { return this->get(__sb, this->widen('\n')); }
+ __istream_type&
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ getline(char_type* __s, streamsize __n)
+ { return this->getline(__s, __n, this->widen('\n')); }
+ __istream_type&
+ ignore();
+ __istream_type&
+ ignore(streamsize __n);
+ __istream_type&
+ ignore(streamsize __n, int_type __delim);
+ int_type
+ peek();
+ __istream_type&
+ read(char_type* __s, streamsize __n);
+ streamsize
+ readsome(char_type* __s, streamsize __n);
+ __istream_type&
+ putback(char_type __c);
+ __istream_type&
+ unget();
+ int
+ sync();
+ pos_type
+ tellg();
+ __istream_type&
+ seekg(pos_type);
+ __istream_type&
+ seekg(off_type, ios_base::seekdir);
+ protected:
+ basic_istream()
+ : _M_gcount(streamsize(0))
+ { this->init(0); }
+ template<typename _ValueT>
+ __istream_type&
+ _M_extract(_ValueT& __v);
+ };
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n, int_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n, int_type __delim);
+ template<typename _CharT, typename _Traits>
+ class basic_istream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ public:
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::__ctype_type __ctype_type;
+ typedef typename _Traits::int_type __int_type;
+ explicit
+ sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __in, char* __s);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ class basic_iostream
+ : public basic_istream<_CharT, _Traits>,
+ public basic_ostream<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ explicit
+ basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
+ : __istream_type(__sb), __ostream_type(__sb) { }
+ virtual
+ ~basic_iostream() { }
+ protected:
+ basic_iostream()
+ : __istream_type(), __ostream_type() { }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __is);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>::sentry::
+ sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ if (__in.good())
+ {
+ if (__in.tie())
+ __in.tie()->flush();
+ if (!__noskip && bool(__in.flags() & ios_base::skipws))
+ {
+ const __int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ const __ctype_type& __ct = __check_facet(__in._M_ctype);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space,
+ traits_type::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ }
+ if (__in.good() && __err == ios_base::goodbit)
+ _M_ok = true;
+ else
+ {
+ __err |= ios_base::failbit;
+ __in.setstate(__err);
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ _M_extract(_ValueT& __v)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __v);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(short& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<short>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<short>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__max;
+ }
+ else
+ __n = short(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(int& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<int>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<int>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__max;
+ }
+ else
+ __n = int(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(__streambuf_type* __sbout)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, false);
+ if (__cerb && __sbout)
+ {
+ try
+ {
+ bool __ineof;
+ if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
+ __err |= ios_base::failbit;
+ if (__ineof)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::failbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbout)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ get(void)
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __c = __eof;
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ __c = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__c, __eof))
+ _M_gcount = 1;
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type& __c)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __cb = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__cb, traits_type::eof()))
+ {
+ _M_gcount = 1;
+ __c = traits_type::to_char_type(__cb);
+ }
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(__streambuf_type& __sb, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __this_sb = this->rdbuf();
+ int_type __c = __this_sb->sgetc();
+ char_type __c2 = traits_type::to_char_type(__c);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim)
+ && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
+ {
+ ++_M_gcount;
+ __c = __this_sb->snextc();
+ __c2 = traits_type::to_char_type(__c);
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ getline(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ ++_M_gcount;
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else
+ {
+ if (traits_type::eq_int_type(__c, __idelim))
+ {
+ __sb->sbumpc();
+ ++_M_gcount;
+ }
+ else
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
+ __err |= ios_base::eofbit;
+ else
+ _M_gcount = 1;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n, int_type __delim)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else if (traits_type::eq_int_type(__c, __delim))
+ {
+ if (_M_gcount
+ < __gnu_cxx::__numeric_traits<streamsize>::__max)
+ ++_M_gcount;
+ __sb->sbumpc();
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ peek(void)
+ {
+ int_type __c = traits_type::eof();
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __c = this->rdbuf()->sgetc();
+ if (traits_type::eq_int_type(__c, traits_type::eof()))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ read(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ _M_gcount = this->rdbuf()->sgetn(__s, __n);
+ if (_M_gcount != __n)
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_istream<_CharT, _Traits>::
+ readsome(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const streamsize __num = this->rdbuf()->in_avail();
+ if (__num > 0)
+ _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
+ else if (__num == -1)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return _M_gcount;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ putback(char_type __c)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ unget(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sungetc(), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ int
+ basic_istream<_CharT, _Traits>::
+ sync(void)
+ {
+ int __ret = -1;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __streambuf_type* __sb = this->rdbuf();
+ if (__sb)
+ {
+ if (__sb->pubsync() == -1)
+ __err |= ios_base::badbit;
+ else
+ __ret = 0;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::pos_type
+ basic_istream<_CharT, _Traits>::
+ tellg(void)
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
+ ios_base::in);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::int_type __int_type;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __int_type __cb = __in.rdbuf()->sbumpc();
+ if (!_Traits::eq_int_type(__cb, _Traits::eof()))
+ __c = _Traits::to_char_type(__cb);
+ else
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ if (__err)
+ __in.setstate(__err);
+ }
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename _Traits::int_type int_type;
+ typedef _CharT char_type;
+ typedef ctype<_CharT> __ctype_type;
+ streamsize __extracted = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ streamsize __num = __in.width();
+ if (__num <= 0)
+ __num = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ int_type __c = __sb->sgetc();
+ while (__extracted < __num - 1
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ *__s++ = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __sb->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ *__s = char_type();
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ }
+ if (!__extracted)
+ __err |= ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __in)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename __istream_type::int_type __int_type;
+ typedef ctype<_CharT> __ctype_type;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ while (!_Traits::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (_Traits::eq_int_type(__c, __eof))
+ __in.setstate(ios_base::eofbit);
+ return __in;
+ }
+ extern template class basic_istream<char>;
+ extern template istream& ws(istream&);
+ extern template istream& operator>>(istream&, char&);
+ extern template istream& operator>>(istream&, char*);
+ extern template istream& operator>>(istream&, unsigned char&);
+ extern template istream& operator>>(istream&, signed char&);
+ extern template istream& operator>>(istream&, unsigned char*);
+ extern template istream& operator>>(istream&, signed char*);
+ extern template istream& istream::_M_extract(unsigned short&);
+ extern template istream& istream::_M_extract(unsigned int&);
+ extern template istream& istream::_M_extract(long&);
+ extern template istream& istream::_M_extract(unsigned long&);
+ extern template istream& istream::_M_extract(bool&);
+ extern template istream& istream::_M_extract(long long&);
+ extern template istream& istream::_M_extract(unsigned long long&);
+ extern template istream& istream::_M_extract(float&);
+ extern template istream& istream::_M_extract(double&);
+ extern template istream& istream::_M_extract(long double&);
+ extern template istream& istream::_M_extract(void*&);
+ extern template class basic_iostream<char>;
+ extern template class basic_istream<wchar_t>;
+ extern template wistream& ws(wistream&);
+ extern template wistream& operator>>(wistream&, wchar_t&);
+ extern template wistream& operator>>(wistream&, wchar_t*);
+ extern template wistream& wistream::_M_extract(unsigned short&);
+ extern template wistream& wistream::_M_extract(unsigned int&);
+ extern template wistream& wistream::_M_extract(long&);
+ extern template wistream& wistream::_M_extract(unsigned long&);
+ extern template wistream& wistream::_M_extract(bool&);
+ extern template wistream& wistream::_M_extract(long long&);
+ extern template wistream& wistream::_M_extract(unsigned long long&);
+ extern template wistream& wistream::_M_extract(float&);
+ extern template wistream& wistream::_M_extract(double&);
+ extern template wistream& wistream::_M_extract(long double&);
+ extern template wistream& wistream::_M_extract(void*&);
+ extern template class basic_iostream<wchar_t>;
+}
+namespace std {
+ extern istream cin;
+ extern ostream cout;
+ extern ostream cerr;
+ extern ostream clog;
+ extern wistream wcin;
+ extern wostream wcout;
+ extern wostream wcerr;
+ extern wostream wclog;
+ static ios_base::Init __ioinit;
+}
+
+extern "C" {
+void __attribute__((__cdecl__)) __assert (const char *, int, const char *) __attribute__ ((__noreturn__));
+void __attribute__((__cdecl__)) __assert_func (const char *, int, const char *, const char *) __attribute__ ((__noreturn__));
+}
+int main() {
+ int sum = 0, factor = 10;
+ void (*ERROR_missing_result_type_before_the_local_function_parameter_macro_id10)(); typedef void (*boost_closure_auxXdeduce_result_tagX10X)( int ERROR_missing_result_type_before_the_local_function_parameter_macro_id10 ) ; typedef __typeof__(boost::type_of::ensure_obj(::boost::scope_exit::aux::wrap( ::boost::scope_exit::aux::deref( ERROR_missing_result_type_before_the_local_function_parameter_macro_id10, (boost_closure_auxXdeduce_result_tagX10X)0 ) ))) boost_closure_auxXdeduce_result_wrapX10X ; typedef boost_closure_auxXdeduce_result_wrapX10X::type boost_closure_auxXdeduce_result_captureX10X ; struct boost_closure_auxXdeduce_result_paramsX10X { typedef boost_closure_auxXdeduce_result_captureX10X function_ptr; }; typedef ::boost::remove_pointer< boost_closure_auxXdeduce_result_paramsX10X::function_ptr >::type boost_closure_auxXdeduce_result_function_typeX10X ; typedef ::boost::function_traits< boost_closure_auxXdeduce_result_function_typeX10X >::result_type boost_closure_auxXresult_typeX10X ; typedef void
 (*boost_se_tag_0_10)(int factor); typedef void (*boost_se_tag_1_10)(int & sum); typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(factor, (boost_se_tag_0_10)0)))) boost_se_wrapped_t_0_10; typedef boost_se_wrapped_t_0_10::type boost_se_capture_t_0_10; typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(& sum, (boost_se_tag_1_10)0)))) boost_se_wrapped_t_1_10; typedef boost_se_wrapped_t_1_10::type boost_se_capture_t_1_10; struct boost_se_params_t_10 { typedef boost_se_capture_t_0_10 boost_se_param_t_0_10; typedef boost_se_capture_t_1_10 boost_se_param_t_1_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_0_10 , boost_se_tag_0_10 > ) >::arg1_type boost_se_param_0_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_1_10 , boost_se_tag_1_10 > ) >::arg1_type boost_se_param_1_10; } boost_closure_auxXparamsX10X = { { boost::scope_exit::aux
::deref(factor, (boost_se_tag_0_10)0) } , { boost::scope_exit::aux::deref(& sum, (boost_se_tag_1_10)0) } }; ::boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< sizeof(boost_closure_auxXargsX) >::cmp1<0>::cmp2 > boost_closure_auxXargsX; boost_closure_auxXargsX.value = &boost_closure_auxXparamsX10X; class boost_closure_auxXfunctorX10X { typedef boost_closure_auxXresult_typeX10X (boost_closure_auxXfunction_typeX) ( int num ); typedef boost::function_traits< void ( ::boost::local::aux::function< boost_closure_auxXfunction_typeX , 0 > ) >::arg1_type boost_closure_auxXfunctor_typeX ; typedef boost_se_params_t_10:: boost_se_param_t_0_10 factorXtypeof_typeXboost_closure_auxX ; typedef boost_se_params_t_10:: boost_se_param_t_1_10 & sumXtypeof_typeXboost_closure_auxX ; public: inline explicit boost_closure_auxXfunctorX10X( void* bind_params) : boost_closure_auxXbindX0X ( static_cast< boost_se_params_t_10* >(bind_params)-> boost_se_param_0_10.value ) , boost_closure_auxXbindX1X ( static_cast< boost_se_
params_t_10* >(bind_params)-> boost_se_param_1_10.value ) { } inline boost_closure_auxXresult_typeX10X operator()( ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) const { return boost_closure_auxXbodyX( boost_closure_auxXbindX0X , boost_closure_auxXbindX1X , arg1 ); } inline static boost_closure_auxXresult_typeX10X boost_closure_auxXcallX0X( void* object , ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) { return static_cast< boost_closure_auxXfunctorX10X* >( object)->operator()( arg1 ); } inline static void boost_closure_auxXinit_callX( void* object, boost_closure_auxXfunctor_typeX& functor) { functor.boost_closure_auxXinit_callX(object, &boost_closure_auxXcallX0X ); } private: boost_se_params_t_10:: boost_se_param_t_0_10 & boost_closure_auxXbindX0X ; boost_se_params_t_10:: boost_se_param_t_1_10 & boost_closure_auxXbindX1X ; boost::scope_exit::aux::undeclared boost_closure_aux
XargsX; inline boost_closure_auxXresult_typeX10X boost_closure_auxXbodyX( boost_se_params_t_10:: boost_se_param_t_0_10 factor , boost_se_params_t_10:: boost_se_param_t_1_10 & sum , int num ) const {
+ sum += factor * num;
+ std::cout << "Summed: " << sum << std::endl;
+ } public: boost_closure_auxXfunctor_typeX boost_closure_auxXnon_recursiveX; } boost_closure_auxXaddX(boost_closure_auxXargsX.value); __typeof__(boost::type_of::ensure_obj(boost_closure_auxXaddX. boost_closure_auxXnon_recursiveX)) add; boost_closure_auxXaddX.boost_closure_auxXinit_callX( &boost_closure_auxXaddX, add);
+ add(1);
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add);
+ ((sum == 60) ? (void)0 : __assert_func ("02.cpp", 20, __PRETTY_FUNCTION__, "sum == 60"));
+ return 0;
+}

Added: sandbox/closure/buff01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/buff01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,42 @@
+
+#include <vector>
+#include <cstdlib>
+#include <iostream>
+
+template<typename T, typename A = int>
+struct buf {
+ explicit buf(size_t count = 0) {
+ std::cout << "created with size " << count << std::endl;
+ }
+ void push_back(T const& value) {
+ std::cout << "pushed " << value << std::endl;
+ }
+};
+
+template<class C>
+struct separate_ptr {
+ typedef C class_type;
+
+ separate_ptr(C* ptr) : ptr_(ptr) {}
+
+private:
+ C* ptr_;
+};
+
+int main() {
+ typedef buf<int> b_t;
+ b_t* b = new b_t(2);
+ b->push_back(1);
+
+// void (std::vector<int>::*f)(int const&) = &std::vector<int>::push_back;
+// (v->*f)(2);
+
+ (b->*&b_t::push_back)(3);
+
+ typedef std::vector<int> v_t;
+ v_t* v = new v_t(2);
+
+
+ return EXIT_SUCCESS;
+}
+

Added: sandbox/closure/c01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/c01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,17973 @@
+
+typedef int ptrdiff_t;
+typedef unsigned int size_t;
+namespace std {
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+
+namespace std {
+ namespace rel_ops
+ {
+ template <class _Tp>
+ inline bool
+ operator!=(const _Tp& __x, const _Tp& __y)
+ { return !(__x == __y); }
+ template <class _Tp>
+ inline bool
+ operator>(const _Tp& __x, const _Tp& __y)
+ { return __y < __x; }
+ template <class _Tp>
+ inline bool
+ operator<=(const _Tp& __x, const _Tp& __y)
+ { return !(__y < __x); }
+ template <class _Tp>
+ inline bool
+ operator>=(const _Tp& __x, const _Tp& __y)
+ { return !(__x < __y); }
+ }
+}
+
+
+
+
+namespace std {
+ template<typename _Tp>
+ inline void
+ swap(_Tp& __a, _Tp& __b)
+ {
+
+ _Tp __tmp = (__a);
+ __a = (__b);
+ __b = (__tmp);
+ }
+ template<typename _Tp, size_t _Nm>
+ inline void
+ swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+ {
+ for (size_t __n = 0; __n < _Nm; ++__n)
+ swap(__a[__n], __b[__n]);
+ }
+}
+namespace std {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair()
+ : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ template<class _U1, class _U2>
+ pair(const pair<_U1, _U2>& __p)
+ : first(__p.first),
+ second(__p.second) { }
+ };
+ template<class _T1, class _T2>
+ inline bool
+ operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first == __y.first && __x.second == __y.second; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first < __y.first
+ || (!(__y.first < __x.first) && __x.second < __y.second); }
+ template<class _T1, class _T2>
+ inline bool
+ operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x == __y); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __y < __x; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__y < __x); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x < __y); }
+ template<class _T1, class _T2>
+ inline pair<_T1, _T2>
+ make_pair(_T1 __x, _T2 __y)
+ { return pair<_T1, _T2>(__x, __y); }
+}
+extern "C" {
+extern "C" {
+}
+extern "C" {
+}
+extern "C" {
+typedef signed char __int8_t ;
+typedef unsigned char __uint8_t ;
+typedef signed short __int16_t;
+typedef unsigned short __uint16_t;
+typedef __int16_t __int_least16_t;
+typedef __uint16_t __uint_least16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+typedef __int32_t __int_least32_t;
+typedef __uint32_t __uint_least32_t;
+typedef signed long long __int64_t;
+typedef unsigned long long __uint64_t;
+
+}
+typedef void *_LOCK_T;
+extern "C"
+{
+void __cygwin_lock_init(_LOCK_T *);
+void __cygwin_lock_init_recursive(_LOCK_T *);
+void __cygwin_lock_fini(_LOCK_T *);
+void __cygwin_lock_lock(_LOCK_T *);
+int __cygwin_lock_trylock(_LOCK_T *);
+void __cygwin_lock_unlock(_LOCK_T *);
+}
+typedef long _off_t;
+typedef short __dev_t;
+typedef unsigned short __uid_t;
+typedef unsigned short __gid_t;
+__extension__ typedef long long _off64_t;
+typedef long _fpos_t;
+typedef _off64_t _fpos64_t;
+typedef int _ssize_t;
+typedef unsigned int wint_t;
+typedef struct
+{
+ int __count;
+ union
+ {
+ wint_t __wch;
+ unsigned char __wchb[4];
+ } __value;
+} _mbstate_t;
+typedef _LOCK_T _flock_t;
+typedef void *_iconv_t;
+typedef long int __off_t;
+typedef int __pid_t;
+__extension__ typedef long long int __loff_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+typedef unsigned long clock_t;
+typedef long time_t;
+struct timespec {
+ time_t tv_sec;
+ long tv_nsec;
+};
+struct itimerspec {
+ struct timespec it_interval;
+ struct timespec it_value;
+};
+typedef long daddr_t;
+typedef char * caddr_t;
+
+typedef int pid_t;
+typedef _ssize_t ssize_t;
+typedef unsigned short nlink_t;
+typedef long fd_mask;
+typedef struct _types_fd_set {
+ fd_mask fds_bits[(((64)+(((sizeof (fd_mask) * 8))-1))/((sizeof (fd_mask) * 8)))];
+} _types_fd_set;
+typedef unsigned long clockid_t;
+typedef unsigned long timer_t;
+typedef unsigned long useconds_t;
+typedef long suseconds_t;
+extern "C"
+{
+typedef signed char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+typedef long long int64_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+typedef signed char int_least8_t;
+typedef short int_least16_t;
+typedef int int_least32_t;
+typedef long long int_least64_t;
+typedef unsigned char uint_least8_t;
+typedef unsigned short uint_least16_t;
+typedef unsigned int uint_least32_t;
+typedef unsigned long long uint_least64_t;
+typedef signed char int_fast8_t;
+typedef int int_fast16_t;
+typedef int int_fast32_t;
+typedef long long int_fast64_t;
+typedef unsigned char uint_fast8_t;
+typedef unsigned int uint_fast16_t;
+typedef unsigned int uint_fast32_t;
+typedef unsigned long long uint_fast64_t;
+typedef int intptr_t;
+typedef unsigned int uintptr_t;
+typedef long long intmax_t;
+typedef unsigned long long uintmax_t;
+extern "C" {
+static __inline unsigned short
+bswap_16 (unsigned short __x)
+{
+ return (__x >> 8) | (__x << 8);
+}
+static __inline unsigned int
+bswap_32 (unsigned int __x)
+{
+ return (bswap_16 (__x & 0xffff) << 16) | (bswap_16 (__x >> 16));
+}
+static __inline unsigned long long
+bswap_64 (unsigned long long __x)
+{
+ return (((unsigned long long) bswap_32 (__x & 0xffffffffull)) << 32) | (bswap_32 (__x >> 32));
+}
+}
+typedef struct timespec timespec_t;
+typedef struct timespec timestruc_t;
+typedef _off64_t off_t;
+typedef __loff_t loff_t;
+typedef short __dev16_t;
+typedef unsigned long __dev32_t;
+typedef __dev32_t dev_t;
+typedef long blksize_t;
+typedef long __blkcnt32_t;
+typedef long long __blkcnt64_t;
+typedef __blkcnt64_t blkcnt_t;
+typedef unsigned long fsblkcnt_t;
+typedef unsigned long fsfilcnt_t;
+typedef unsigned short __uid16_t;
+typedef unsigned long __uid32_t;
+typedef __uid32_t uid_t;
+typedef unsigned short __gid16_t;
+typedef unsigned long __gid32_t;
+typedef __gid32_t gid_t;
+typedef unsigned long __ino32_t;
+typedef unsigned long long __ino64_t;
+typedef __ino64_t ino_t;
+typedef unsigned long id_t;
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+typedef long long key_t;
+typedef unsigned long vm_offset_t;
+typedef unsigned long vm_size_t;
+typedef void *vm_object_t;
+typedef unsigned char u_int8_t;
+typedef __uint16_t u_int16_t;
+typedef __uint32_t u_int32_t;
+typedef __uint64_t u_int64_t;
+typedef __int32_t register_t;
+typedef char *addr_t;
+typedef unsigned mode_t;
+typedef struct __pthread_t {char __dummy;} *pthread_t;
+typedef struct __pthread_mutex_t {char __dummy;} *pthread_mutex_t;
+typedef struct __pthread_key_t {char __dummy;} *pthread_key_t;
+typedef struct __pthread_attr_t {char __dummy;} *pthread_attr_t;
+typedef struct __pthread_mutexattr_t {char __dummy;} *pthread_mutexattr_t;
+typedef struct __pthread_condattr_t {char __dummy;} *pthread_condattr_t;
+typedef struct __pthread_cond_t {char __dummy;} *pthread_cond_t;
+typedef struct
+{
+ pthread_mutex_t mutex;
+ int state;
+}
+pthread_once_t;
+typedef struct __pthread_rwlock_t {char __dummy;} *pthread_rwlock_t;
+typedef struct __pthread_rwlockattr_t {char __dummy;} *pthread_rwlockattr_t;
+}
+extern char **environ;
+void __attribute__((__cdecl__)) _exit (int __status ) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) access (const char *__path, int __amode );
+unsigned __attribute__((__cdecl__)) alarm (unsigned __secs );
+int __attribute__((__cdecl__)) chdir (const char *__path );
+int __attribute__((__cdecl__)) chmod (const char *__path, mode_t __mode );
+int __attribute__((__cdecl__)) chown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) chroot (const char *__path );
+int __attribute__((__cdecl__)) close (int __fildes );
+size_t __attribute__((__cdecl__)) confstr (int __name, char *__buf, size_t __len);
+char * __attribute__((__cdecl__)) ctermid (char *__s );
+char * __attribute__((__cdecl__)) cuserid (char *__s );
+int __attribute__((__cdecl__)) daemon (int nochdir, int noclose);
+int __attribute__((__cdecl__)) dup (int __fildes );
+int __attribute__((__cdecl__)) dup2 (int __fildes, int __fildes2 );
+int __attribute__((__cdecl__)) dup3 (int __fildes, int __fildes2, int flags);
+int __attribute__((__cdecl__)) eaccess (const char *__path, int __mode);
+void __attribute__((__cdecl__)) endusershell (void);
+int __attribute__((__cdecl__)) euidaccess (const char *__path, int __mode);
+int __attribute__((__cdecl__)) execl (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execle (const char *__path, const char *, ... );
+int __attribute__((__cdecl__)) execlp (const char *__file, const char *, ... );
+int __attribute__((__cdecl__)) execv (const char *__path, char * const __argv[] );
+int __attribute__((__cdecl__)) execve (const char *__path, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) execvp (const char *__file, char * const __argv[] );
+int __attribute__((__cdecl__)) execvpe (const char *__file, char * const __argv[], char * const __envp[] );
+int __attribute__((__cdecl__)) faccessat (int __dirfd, const char *__path, int __mode, int __flags);
+int __attribute__((__cdecl__)) fchdir (int __fildes);
+int __attribute__((__cdecl__)) fchmod (int __fildes, mode_t __mode );
+int __attribute__((__cdecl__)) fchown (int __fildes, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) fchownat (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags);
+int __attribute__((__cdecl__)) fexecve (int __fd, char * const __argv[], char * const __envp[] );
+pid_t __attribute__((__cdecl__)) fork (void );
+long __attribute__((__cdecl__)) fpathconf (int __fd, int __name );
+int __attribute__((__cdecl__)) fsync (int __fd);
+int __attribute__((__cdecl__)) fdatasync (int __fd);
+char * __attribute__((__cdecl__)) getcwd (char *__buf, size_t __size );
+int __attribute__((__cdecl__)) getdomainname (char *__name, size_t __len);
+gid_t __attribute__((__cdecl__)) getegid (void );
+uid_t __attribute__((__cdecl__)) geteuid (void );
+gid_t __attribute__((__cdecl__)) getgid (void );
+int __attribute__((__cdecl__)) getgroups (int __gidsetsize, gid_t __grouplist[] );
+long __attribute__((__cdecl__)) gethostid (void);
+char * __attribute__((__cdecl__)) getlogin (void );
+int __attribute__((__cdecl__)) getlogin_r (char *name, size_t namesize);
+char * __attribute__((__cdecl__)) getpass (const char *__prompt);
+int __attribute__((__cdecl__)) getpagesize (void);
+int __attribute__((__cdecl__)) getpeereid (int, uid_t *, gid_t *);
+pid_t __attribute__((__cdecl__)) getpgid (pid_t);
+pid_t __attribute__((__cdecl__)) getpgrp (void );
+pid_t __attribute__((__cdecl__)) getpid (void );
+pid_t __attribute__((__cdecl__)) getppid (void );
+pid_t __attribute__((__cdecl__)) getsid (pid_t);
+uid_t __attribute__((__cdecl__)) getuid (void );
+char * __attribute__((__cdecl__)) getusershell (void);
+char * __attribute__((__cdecl__)) getwd (char *__buf );
+int __attribute__((__cdecl__)) iruserok (unsigned long raddr, int superuser, const char *ruser, const char *luser);
+int __attribute__((__cdecl__)) isatty (int __fildes );
+int __attribute__((__cdecl__)) lchown (const char *__path, uid_t __owner, gid_t __group );
+int __attribute__((__cdecl__)) link (const char *__path1, const char *__path2 );
+int __attribute__((__cdecl__)) linkat (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags );
+int __attribute__((__cdecl__)) nice (int __nice_value );
+off_t __attribute__((__cdecl__)) lseek (int __fildes, off_t __offset, int __whence );
+int __attribute__((__cdecl__)) lockf (int __fd, int __cmd, off_t __len);
+long __attribute__((__cdecl__)) pathconf (const char *__path, int __name );
+int __attribute__((__cdecl__)) pause (void );
+int __attribute__((__cdecl__)) pthread_atfork (void (*)(void), void (*)(void), void (*)(void));
+int __attribute__((__cdecl__)) pipe (int __fildes[2] );
+int __attribute__((__cdecl__)) pipe2 (int __fildes[2], int flags);
+ssize_t __attribute__((__cdecl__)) pread (int __fd, void *__buf, size_t __nbytes, off_t __offset);
+ssize_t __attribute__((__cdecl__)) pwrite (int __fd, const void *__buf, size_t __nbytes, off_t __offset);
+_ssize_t __attribute__((__cdecl__)) read (int __fd, void *__buf, size_t __nbyte );
+int __attribute__((__cdecl__)) rresvport (int *__alport);
+int __attribute__((__cdecl__)) revoke (char *__path);
+int __attribute__((__cdecl__)) rmdir (const char *__path );
+int __attribute__((__cdecl__)) ruserok (const char *rhost, int superuser, const char *ruser, const char *luser);
+void * __attribute__((__cdecl__)) sbrk (ptrdiff_t __incr);
+int __attribute__((__cdecl__)) setegid (gid_t __gid );
+int __attribute__((__cdecl__)) seteuid (uid_t __uid );
+int __attribute__((__cdecl__)) setgid (gid_t __gid );
+int __attribute__((__cdecl__)) setgroups (int ngroups, const gid_t *grouplist );
+int __attribute__((__cdecl__)) setpgid (pid_t __pid, pid_t __pgid );
+int __attribute__((__cdecl__)) setpgrp (void );
+int __attribute__((__cdecl__)) setregid (gid_t __rgid, gid_t __egid);
+int __attribute__((__cdecl__)) setreuid (uid_t __ruid, uid_t __euid);
+pid_t __attribute__((__cdecl__)) setsid (void );
+int __attribute__((__cdecl__)) setuid (uid_t __uid );
+void __attribute__((__cdecl__)) setusershell (void);
+unsigned __attribute__((__cdecl__)) sleep (unsigned int __seconds );
+void __attribute__((__cdecl__)) swab (const void *, void *, ssize_t);
+long __attribute__((__cdecl__)) sysconf (int __name );
+pid_t __attribute__((__cdecl__)) tcgetpgrp (int __fildes );
+int __attribute__((__cdecl__)) tcsetpgrp (int __fildes, pid_t __pgrp_id );
+char * __attribute__((__cdecl__)) ttyname (int __fildes );
+int __attribute__((__cdecl__)) ttyname_r (int, char *, size_t);
+int __attribute__((__cdecl__)) unlink (const char *__path );
+int __attribute__((__cdecl__)) usleep (useconds_t __useconds);
+int __attribute__((__cdecl__)) vhangup (void );
+_ssize_t __attribute__((__cdecl__)) write (int __fd, const void *__buf, size_t __nbyte );
+extern "C" {
+extern int __attribute__((dllimport)) opterr;
+extern int __attribute__((dllimport)) optind;
+extern int __attribute__((dllimport)) optopt;
+extern int __attribute__((dllimport)) optreset;
+extern char __attribute__((dllimport)) *optarg;
+int getopt (int, char * const *, const char *);
+}
+pid_t __attribute__((__cdecl__)) vfork (void );
+int __attribute__((__cdecl__)) ftruncate (int __fd, off_t __length);
+int __attribute__((__cdecl__)) truncate (const char *, off_t __length);
+int __attribute__((__cdecl__)) getdtablesize (void);
+int __attribute__((__cdecl__)) setdtablesize (int);
+useconds_t __attribute__((__cdecl__)) ualarm (useconds_t __useconds, useconds_t __interval);
+ int __attribute__((__cdecl__)) gethostname (char *__name, size_t __len);
+char * __attribute__((__cdecl__)) mktemp (char *);
+void __attribute__((__cdecl__)) sync (void);
+ssize_t __attribute__((__cdecl__)) readlink (const char *__path, char *__buf, size_t __buflen);
+ssize_t __attribute__((__cdecl__)) readlinkat (int __dirfd1, const char *__path, char *__buf, size_t __buflen);
+int __attribute__((__cdecl__)) symlink (const char *__name1, const char *__name2);
+int __attribute__((__cdecl__)) symlinkat (const char *, int, const char *);
+int __attribute__((__cdecl__)) unlinkat (int, const char *, int);
+}
+
+namespace boost{
+ __extension__ typedef long long long_long_type;
+ __extension__ typedef unsigned long long ulong_long_type;
+}
+namespace mpl_ { namespace aux {} }
+namespace boost { namespace mpl { using namespace mpl_;
+namespace aux { using namespace mpl_::aux; }
+}}
+namespace mpl_ {
+template< int N > struct int_;
+}
+namespace boost { namespace mpl { using ::mpl_::int_; } }
+namespace mpl_ {
+struct integral_c_tag { static const int value = 0; };
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c_tag; } }
+namespace mpl_ {
+template< int N >
+struct int_
+{
+ static const int value = N;
+ typedef int_ type;
+ typedef int value_type;
+ typedef integral_c_tag tag;
+ typedef mpl_::int_< static_cast<int>((value + 1)) > next;
+ typedef mpl_::int_< static_cast<int>((value - 1)) > prior;
+ operator int() const { return static_cast<int>(this->value); }
+};
+template< int N >
+int const mpl_::int_< N >::value;
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename F > struct template_arity;
+}}}
+namespace mpl_ {
+template< bool C_ > struct bool_;
+typedef bool_<true> true_;
+typedef bool_<false> false_;
+}
+namespace boost { namespace mpl { using ::mpl_::bool_; } }
+namespace boost { namespace mpl { using ::mpl_::true_; } }
+namespace boost { namespace mpl { using ::mpl_::false_; } }
+namespace mpl_ {
+template< bool C_ > struct bool_
+{
+ static const bool value = C_;
+ typedef integral_c_tag tag;
+ typedef bool_ type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+template< bool C_ >
+bool const bool_<C_>::value;
+}
+namespace mpl_ {
+template< typename T, T N > struct integral_c;
+}
+namespace boost { namespace mpl { using ::mpl_::integral_c; } }
+namespace mpl_ {
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+ typedef integral_c type;
+ typedef T value_type;
+ typedef integral_c_tag tag;
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+ typedef integral_c< T, static_cast<T>((value - 1)) > prior;
+ operator T() const { return static_cast<T>(this->value); }
+};
+template< typename T, T N >
+T const integral_c< T, N >::value;
+}
+namespace mpl_ {
+template< bool C >
+struct integral_c<bool, C>
+{
+ static const bool value = C;
+ typedef integral_c_tag tag;
+ typedef integral_c type;
+ typedef bool value_type;
+ operator bool() const { return this->value; }
+};
+}
+namespace boost{
+template <class T, T val>
+struct integral_constant : public mpl::integral_c<T, val>
+{
+ typedef integral_constant<T,val> type;
+};
+template<> struct integral_constant<bool,true> : public mpl::true_
+{
+ typedef integral_constant<bool,true> type;
+};
+template<> struct integral_constant<bool,false> : public mpl::false_
+{
+ typedef integral_constant<bool,false> type;
+};
+typedef integral_constant<bool,true> true_type;
+typedef integral_constant<bool,false> false_type;
+}
+namespace boost {
+template< typename T > struct is_lvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_lvalue_reference< T& > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_rvalue_reference : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+namespace type_traits {
+typedef char yes_type;
+struct no_type
+{
+ char padding[8];
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
+struct ice_or;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_or
+{
+ static const bool value = true;
+};
+template <>
+struct ice_or<false, false, false, false, false, false, false>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
+struct ice_and;
+template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
+struct ice_and
+{
+ static const bool value = false;
+};
+template <>
+struct ice_and<true, true, true, true, true, true, true>
+{
+ static const bool value = true;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <bool b>
+struct ice_not
+{
+ static const bool value = true;
+};
+template <>
+struct ice_not<true>
+{
+ static const bool value = false;
+};
+}
+}
+namespace boost {
+namespace type_traits {
+template <int b1, int b2>
+struct ice_eq
+{
+ static const bool value = (b1 == b2);
+};
+template <int b1, int b2>
+struct ice_ne
+{
+ static const bool value = (b1 != b2);
+};
+template <int b1, int b2> bool const ice_eq<b1,b2>::value;
+template <int b1, int b2> bool const ice_ne<b1,b2>::value;
+}
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct is_reference_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value >::value);
+};
+}
+template< typename T > struct is_reference : public ::boost::integral_constant<bool,::boost::detail::is_reference_impl<T>::value> { public: };
+}
+namespace boost {
+namespace type_traits {
+struct false_result
+{
+ template <typename T> struct result_
+ {
+ static const bool value = false;
+ };
+};
+}}
+namespace boost {
+namespace type_traits {
+template <class R>
+struct is_function_ptr_helper
+{
+ static const bool value = false;
+};
+template <class R >
+struct is_function_ptr_helper<R (*)()> { static const bool value = true; };
+template <class R >
+struct is_function_ptr_helper<R (*)( ...)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0)> { static const bool value = true; };
+template <class R , class T0>
+struct is_function_ptr_helper<R (*)( T0 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1)> { static const bool value = true; };
+template <class R , class T0 , class T1>
+struct is_function_ptr_helper<R (*)( T0 , T1 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)> { static const bool value = true; };
+template <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)> { static const bool value = true; };
+}
+}
+namespace boost {
+namespace detail {
+template<bool is_ref = true>
+struct is_function_chooser
+ : public ::boost::type_traits::false_result
+{
+};
+template <>
+struct is_function_chooser<false>
+{
+ template< typename T > struct result_
+ : public ::boost::type_traits::is_function_ptr_helper<T*>
+ {
+ };
+};
+template <typename T>
+struct is_function_impl
+ : public is_function_chooser< ::boost::is_reference<T>::value >
+ ::template result_<T>
+{
+};
+}
+template< typename T > struct is_function : public ::boost::integral_constant<bool,::boost::detail::is_function_impl<T>::value> { public: };
+}
+namespace boost
+{
+ template <bool B, class T = void>
+ struct enable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct enable_if_c<false, T> {};
+ template <class Cond, class T = void>
+ struct enable_if : public enable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_enable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_enable_if_c<false, T> {};
+ template <class Cond, class T>
+ struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+ template <bool B, class T = void>
+ struct disable_if_c {
+ typedef T type;
+ };
+ template <class T>
+ struct disable_if_c<true, T> {};
+ template <class Cond, class T = void>
+ struct disable_if : public disable_if_c<Cond::value, T> {};
+ template <bool B, class T>
+ struct lazy_disable_if_c {
+ typedef typename T::type type;
+ };
+ template <class T>
+ struct lazy_disable_if_c<true, T> {};
+ template <class Cond, class T>
+ struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+}
+namespace boost { namespace type_of {
+ template<typename T>
+ typename enable_if<is_function<T>, T&>::type
+ ensure_obj(T&);
+ template<typename T>
+ typename disable_if<is_function<T>, T&>::type
+ ensure_obj(const T&);
+}}
+namespace boost { namespace scope_exit { namespace aux {
+ template<int Dummy = 0>
+ struct declared
+ {
+ void* value;
+ static int const cmp2 = 0;
+ friend void operator>(int, declared const&) {}
+ };
+ struct undeclared { declared<> dummy[2]; };
+ template<int> struct resolve;
+ template<>
+ struct resolve<sizeof(declared<>)>
+ {
+ static const int cmp1 = 0;
+ };
+ template<>
+ struct resolve<sizeof(undeclared)>
+ {
+ template<int>
+ struct cmp1
+ {
+ static int const cmp2 = 0;
+ };
+ };
+} } }
+extern boost::scope_exit::aux::undeclared boost_scope_exit_args;
+namespace boost { namespace scope_exit { namespace aux {
+typedef void (*ref_tag)(int&);
+typedef void (*val_tag)(int );
+template<class T, class Tag> struct member;
+template<class T>
+struct member<T,ref_tag>
+{
+ T& value;
+};
+template<class T>
+struct member<T,val_tag>
+{
+ T value;
+};
+template<class T> inline T& deref(T* p, ref_tag) { return *p; }
+template<class T> inline T& deref(T& r, val_tag) { return r; }
+template<class T>
+struct wrapper
+{
+ typedef T type;
+};
+template<class T> wrapper<T> wrap(T&);
+} } }
+
+namespace boost {
+template< typename T > struct remove_pointer { public: typedef T type; };
+template< typename T > struct remove_pointer<T*> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* volatile> { public: typedef T type; };
+template< typename T > struct remove_pointer<T* const volatile> { public: typedef T type; };
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+namespace boost {
+namespace detail{
+template <class T>
+struct remove_rvalue_ref
+{
+ typedef T type;
+};
+}
+template< typename T > struct remove_reference { public: typedef typename boost::detail::remove_rvalue_ref<T>::type type; };
+template< typename T > struct remove_reference<T&> { public: typedef T type; };
+}
+namespace boost {
+namespace detail {
+template <typename T>
+struct add_pointer_impl
+{
+ typedef typename remove_reference<T>::type no_ref_type;
+ typedef no_ref_type* type;
+};
+}
+template< typename T > struct add_pointer { public: typedef typename boost::detail::add_pointer_impl<T>::type type; };
+}
+namespace boost {
+namespace detail {
+template<typename Function> struct function_traits_helper;
+template<typename R>
+struct function_traits_helper<R (*)(void)>
+{
+ static const unsigned arity = 0;
+ typedef R result_type;
+};
+template<typename R, typename T1>
+struct function_traits_helper<R (*)(T1)>
+{
+ static const unsigned arity = 1;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T1 argument_type;
+};
+template<typename R, typename T1, typename T2>
+struct function_traits_helper<R (*)(T1, T2)>
+{
+ static const unsigned arity = 2;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T1 first_argument_type;
+ typedef T2 second_argument_type;
+};
+template<typename R, typename T1, typename T2, typename T3>
+struct function_traits_helper<R (*)(T1, T2, T3)>
+{
+ static const unsigned arity = 3;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4>
+struct function_traits_helper<R (*)(T1, T2, T3, T4)>
+{
+ static const unsigned arity = 4;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
+{
+ static const unsigned arity = 5;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
+{
+ static const unsigned arity = 6;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
+{
+ static const unsigned arity = 7;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
+{
+ static const unsigned arity = 8;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
+{
+ static const unsigned arity = 9;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+};
+template<typename R, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9,
+ typename T10>
+struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
+{
+ static const unsigned arity = 10;
+ typedef R result_type;
+ typedef T1 arg1_type;
+ typedef T2 arg2_type;
+ typedef T3 arg3_type;
+ typedef T4 arg4_type;
+ typedef T5 arg5_type;
+ typedef T6 arg6_type;
+ typedef T7 arg7_type;
+ typedef T8 arg8_type;
+ typedef T9 arg9_type;
+ typedef T10 arg10_type;
+};
+}
+template<typename Function>
+struct function_traits :
+ public boost::detail::function_traits_helper<typename boost::add_pointer<Function>::type>
+{
+};
+}
+
+namespace boost {
+template< typename T > struct is_integral : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_integral< unsigned char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< unsigned long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< unsigned long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed short > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed short const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed int > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed int const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< signed long > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< signed long const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< bool > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< bool const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< char > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< char const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< wchar_t > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< wchar_t const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::ulong_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::ulong_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_integral< ::boost::long_long_type > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_integral< ::boost::long_long_type const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+template< typename T > struct is_float : public ::boost::integral_constant<bool,false> { public: };
+template<> struct is_float< float > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< float const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+template<> struct is_float< long double > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double volatile > : public ::boost::integral_constant<bool,true> { public: }; template<> struct is_float< long double const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T >
+struct is_arithmetic_impl
+{
+ static const bool value = (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_float<T>::value >::value);
+};
+}
+template< typename T > struct is_arithmetic : public ::boost::integral_constant<bool,::boost::detail::is_arithmetic_impl<T>::value> { public: };
+}
+namespace boost {
+template< typename T, typename U > struct is_same : public ::boost::integral_constant<bool,false> { public: };
+template< typename T > struct is_same< T,T > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template <typename T> struct cv_traits_imp {};
+template <typename T>
+struct cv_traits_imp<T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = false;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<volatile T*>
+{
+ static const bool is_const = false;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+template <typename T>
+struct cv_traits_imp<const volatile T*>
+{
+ static const bool is_const = true;
+ static const bool is_volatile = true;
+ typedef T unqualified_type;
+};
+}
+}
+namespace boost {
+namespace detail{
+template <class T>
+struct is_volatile_rval_filter
+{
+ static const bool value = ::boost::detail::cv_traits_imp<T*>::is_volatile;
+};
+}
+template< typename T > struct is_volatile : public ::boost::integral_constant<bool,::boost::detail::is_volatile_rval_filter<T>::value> { public: };
+template< typename T > struct is_volatile< T& > : public ::boost::integral_constant<bool,false> { public: };
+}
+namespace boost {
+template< typename T > struct is_enum : public ::boost::integral_constant<bool,__is_enum(T)> { public: };
+}
+namespace boost {
+namespace type_traits {
+template <typename T>
+struct is_mem_fun_pointer_impl
+{
+ static const bool value = false;
+};
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)() const volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) volatile > { static const bool value = true; };
+template <class R, class T >
+struct is_mem_fun_pointer_impl<R (T::*)( ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile > { static const bool value = true; };
+template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
+struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile > { static const bool value = true; };
+}
+}
+
+namespace boost {
+namespace detail{
+template <class T>
+struct rvalue_ref_filter_rem_cv
+{
+ typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
+};
+}
+template< typename T > struct remove_cv { public: typedef typename boost::detail::rvalue_ref_filter_rem_cv<T>::type type; };
+template< typename T > struct remove_cv<T&> { public: typedef T& type; };
+template< typename T, std::size_t N > struct remove_cv<T const[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T volatile[N]> { public: typedef T type[N]; };
+template< typename T, std::size_t N > struct remove_cv<T const volatile[N]> { public: typedef T type[N]; };
+}
+namespace boost {
+template< typename T > struct is_member_function_pointer : public ::boost::integral_constant<bool,::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value> { public: };
+}
+namespace boost {
+template< typename T > struct is_member_pointer : public ::boost::integral_constant<bool,::boost::is_member_function_pointer<T>::value> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::* > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*volatile > : public ::boost::integral_constant<bool,true> { public: };
+template< typename T, typename U > struct is_member_pointer< U T::*const volatile > : public ::boost::integral_constant<bool,true> { public: };
+}
+namespace boost {
+namespace detail {
+template< typename T > struct is_pointer_helper
+{
+ static const bool value = false;
+};
+template< typename T > struct is_pointer_helper<T*> { static const bool value = true; };
+template< typename T >
+struct is_pointer_impl
+{
+ static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value);
+};
+}
+template< typename T > struct is_pointer : public ::boost::integral_constant<bool,::boost::detail::is_pointer_impl<T>::value> { public: };
+}
+namespace boost{
+namespace detail{
+template <typename T, bool small_>
+struct ct_imp2
+{
+ typedef const T& param_type;
+};
+template <typename T>
+struct ct_imp2<T, true>
+{
+ typedef const T param_type;
+};
+template <typename T, bool isp, bool b1, bool b2>
+struct ct_imp
+{
+ typedef const T& param_type;
+};
+template <typename T, bool isp, bool b2>
+struct ct_imp<T, isp, true, b2>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool isp, bool b1>
+struct ct_imp<T, isp, b1, true>
+{
+ typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
+};
+template <typename T, bool b1, bool b2>
+struct ct_imp<T, true, b1, b2>
+{
+ typedef const T param_type;
+};
+}
+template <typename T>
+struct call_traits
+{
+public:
+ typedef T value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef typename boost::detail::ct_imp<
+ T,
+ ::boost::is_pointer<T>::value,
+ ::boost::is_arithmetic<T>::value,
+ ::boost::is_enum<T>::value
+ >::param_type param_type;
+};
+template <typename T>
+struct call_traits<T&>
+{
+ typedef T& value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T& param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<T [N]>
+{
+private:
+ typedef T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+template <typename T, std::size_t N>
+struct call_traits<const T [N]>
+{
+private:
+ typedef const T array_type[N];
+public:
+ typedef const T* value_type;
+ typedef array_type& reference;
+ typedef const array_type& const_reference;
+ typedef const T* const param_type;
+};
+}
+namespace boost { namespace local { namespace aux {
+template<typename F, size_t defaults = 0>
+class function {
+};
+template<
+ typename R
+
+
+>
+class function<
+ R ()
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()() const { return call0_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0
+>
+class function<
+ R ( A0)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr1)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call0_(object_ , a0); } inline R operator()() const { return call1_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1
+>
+class function<
+ R ( A0 , A1)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr2)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call0_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call1_(object_ , a0); } inline R operator()() const { return call2_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2
+>
+class function<
+ R ( A0 , A1 , A2)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr3)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call0_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call1_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call2_(object_ , a0); } inline R operator()() const { return call3_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3
+>
+class function<
+ R ( A0 , A1 , A2 , A3)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr4)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call0_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call1_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call2_(object_ , a0 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call3_(object_ , a0); } inline R operator()() const { return call4_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 0
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0
+ ) {
+ object_ = object;
+ call0_ = call0;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 1
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 2
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 3
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 4
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type);
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_;
+ void* unused_;
+};
+template<
+ typename R
+ ,
+ typename A0 , typename A1 , typename A2 , typename A3 , typename A4
+>
+class function<
+ R ( A0 , A1 , A2 , A3 , A4)
+ , 5
+> {
+ typedef void* object_ptr;
+ typedef R (*call_ptr0)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type , typename ::boost::call_traits< A4 >::param_type); typedef R (*call_ptr1)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type , typename ::boost::call_traits< A3 >::param_type); typedef R (*call_ptr2)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type , typename ::boost::call_traits< A2 >::param_type); typedef R (*call_ptr3)(object_ptr , typename ::boost::call_traits< A0 >::param_type , typename ::boost::call_traits< A1 >::param_type); typedef R (*call_ptr4)(object_ptr , typename ::boost::call_traits< A0 >::param_type); typedef R (*call_ptr5)(object_ptr );
+public:
+ inline void boost_closure_auxXinit_callX(
+ object_ptr object,
+ call_ptr0 call0 , call_ptr1 call1 , call_ptr2 call2 , call_ptr3 call3 , call_ptr4 call4 , call_ptr5 call5
+ ) {
+ object_ = object;
+ call0_ = call0; call1_ = call1; call2_ = call2; call3_ = call3; call4_ = call4; call5_ = call5;
+ unused_ = 0;
+ }
+ inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3 , typename ::boost::call_traits< A4 >::param_type a4) const { return call0_(object_ , a0 , a1 , a2 , a3 , a4); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2 , typename ::boost::call_traits< A3 >::param_type a3) const { return call1_(object_ , a0 , a1 , a2 , a3); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1 , typename ::boost::call_traits< A2 >::param_type a2) const { return call2_(object_ , a0 , a1 , a2); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0 , typename ::boost::call_traits< A1 >::param_type a1) const { return call3_(object_ , a0
 , a1); } inline R operator()( typename ::boost::call_traits< A0 >::param_type a0) const { return call4_(object_ , a0); } inline R operator()() const { return call5_(object_ ); }
+private:
+ object_ptr object_;
+ call_ptr0 call0_; call_ptr1 call1_; call_ptr2 call2_; call_ptr3 call3_; call_ptr4 call4_; call_ptr5 call5_;
+ void* unused_;
+};
+}}}
+namespace boost { namespace local { namespace aux {
+template<typename T> struct add_pointed_const { typedef T type; };
+template<typename T> struct add_pointed_const<T*> { typedef T const* type; };
+template<typename T> struct add_pointed_const<T const*>
+ { typedef T const* type; };
+template<typename T> struct add_pointed_const<T* const>
+ { typedef T const* const type; };
+template<typename T> struct add_pointed_const<T const* const>
+ { typedef T const* const type; };
+}}}
+namespace boost {
+template< typename T > struct add_const { public: typedef T const type; };
+template< typename T > struct add_const<T&> { public: typedef T& type; };
+}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct nested_type_wknd
+ : T::type
+{
+};
+}}}
+namespace mpl_ {
+struct void_;
+}
+namespace boost { namespace mpl { using ::mpl_::void_; } }
+namespace mpl_ {
+struct na
+{
+ typedef na type;
+ enum { value = 0 };
+};
+}
+namespace boost { namespace mpl { using ::mpl_::na; } }
+namespace boost { namespace mpl {
+template< typename T >
+struct is_na
+ : false_
+{
+};
+template<>
+struct is_na<na>
+ : true_
+{
+};
+template< typename T >
+struct is_not_na
+ : true_
+{
+};
+template<>
+struct is_not_na<na>
+ : false_
+{
+};
+template< typename T, typename U > struct if_na
+{
+ typedef T type;
+};
+template< typename U > struct if_na<na,U>
+{
+ typedef U type;
+};
+}}
+namespace boost { namespace mpl {
+template<
+ typename T = na
+ , typename Tag = void_
+ , typename Arity = int_< aux::template_arity<T>::value >
+ >
+struct lambda;
+}}
+namespace boost { namespace mpl {
+namespace aux {
+template< long C_ >
+struct not_impl
+ : bool_<!C_>
+{
+};
+}
+template<
+ typename T = na
+ >
+struct not_
+ : aux::not_impl<
+ ::boost::mpl::aux::nested_type_wknd<T>::value
+ >
+{
+
+};
+template<> struct not_< na > { template< typename T1 , typename T2 =na , typename T3 =na , typename T4 =na , typename T5 =na > struct apply : not_< T1 > { }; }; template< typename Tag > struct lambda< not_< na > , Tag , int_<-1> > { typedef false_ is_le; typedef not_< na > result_; typedef not_< na > type; }; namespace aux { template< typename T1 > struct template_arity< not_< T1 > > : int_<1> { }; template<> struct template_arity< not_< na > > : int_<-1> { }; }
+}}
+namespace boost { namespace mpl { namespace aux {
+template< typename T > struct value_type_wknd
+{
+ typedef typename T::value_type type;
+};
+}}}
+namespace boost { namespace mpl { namespace aux {
+typedef char (&no_tag)[1];
+typedef char (&yes_tag)[2];
+template< bool C_ > struct yes_no_tag
+{
+ typedef no_tag type;
+};
+template<> struct yes_no_tag<true>
+{
+ typedef yes_tag type;
+};
+template< long n > struct weighted_tag
+{
+ typedef char (&type)[n];
+};
+}}}
+
+namespace mpl_ {
+struct failed {};
+template< bool C > struct assert { typedef void* type; };
+template<> struct assert<false> { typedef assert type; };
+template< bool C >
+int assertion_failed( typename assert<C>::type );
+template< bool C >
+struct assertion
+{
+ static int failed( assert<false> );
+};
+template<>
+struct assertion<true>
+{
+ static int failed( void* );
+};
+struct assert_
+{
+ template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};
+ static assert_ const arg;
+ enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };
+};
+boost::mpl::aux::weighted_tag<1>::type operator==( assert_, assert_ );
+boost::mpl::aux::weighted_tag<2>::type operator!=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<3>::type operator>( assert_, assert_ );
+boost::mpl::aux::weighted_tag<4>::type operator>=( assert_, assert_ );
+boost::mpl::aux::weighted_tag<5>::type operator<( assert_, assert_ );
+boost::mpl::aux::weighted_tag<6>::type operator<=( assert_, assert_ );
+template< assert_::relations r, long x, long y > struct assert_relation {};
+template< bool > struct assert_arg_pred_impl { typedef int type; };
+template<> struct assert_arg_pred_impl<true> { typedef void* type; };
+template< typename P > struct assert_arg_pred
+{
+ typedef typename P::type p_type;
+ typedef typename assert_arg_pred_impl< p_type::value >::type type;
+};
+template< typename P > struct assert_arg_pred_not
+{
+ typedef typename P::type p_type;
+ enum { p = !p_type::value };
+ typedef typename assert_arg_pred_impl<p>::type type;
+};
+template< typename Pred >
+failed ************ (Pred::************
+ assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )
+ );
+template< typename Pred >
+failed ************ (boost::mpl::not_<Pred>::************
+ assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )
+ );
+template< typename Pred >
+assert<false>
+assert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );
+template< typename Pred >
+assert<false>
+assert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );
+}
+extern boost::scope_exit::aux::undeclared boost_closure_auxXargsX;
+
+
+namespace std {
+ void
+ __throw_bad_exception(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_cast(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_typeid(void) __attribute__((__noreturn__));
+ void
+ __throw_logic_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_domain_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_invalid_argument(const char*) __attribute__((__noreturn__));
+ void
+ __throw_length_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_out_of_range(const char*) __attribute__((__noreturn__));
+ void
+ __throw_runtime_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_range_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_overflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_underflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_ios_failure(const char*) __attribute__((__noreturn__));
+ void
+ __throw_system_error(int) __attribute__((__noreturn__));
+ void
+ __throw_future_error(int) __attribute__((__noreturn__));
+ void
+ __throw_bad_function_call() __attribute__((__noreturn__));
+}
+
+namespace __gnu_cxx {
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+}
+namespace std {
+ struct __true_type { };
+ struct __false_type { };
+ template<bool>
+ struct __truth_type
+ { typedef __false_type __type; };
+ template<>
+ struct __truth_type<true>
+ { typedef __true_type __type; };
+ template<class _Sp, class _Tp>
+ struct __traitor
+ {
+ enum { __value = bool(_Sp::__value) || bool(_Tp::__value) };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+ template<typename, typename>
+ struct __are_same
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __are_same<_Tp, _Tp>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_void
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_void<void>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_integer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_integer<bool>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_floating
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_floating<float>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<long double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer<_Tp*>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_normal_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Iterator, typename _Container>
+ struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator,
+ _Container> >
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_arithmetic
+ : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_fundamental
+ : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_scalar
+ : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_char
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_char<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_char<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_byte
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_byte<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_move_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ class __is_iterator_helper
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+ template<typename _Up>
+ struct _Wrap_type
+ { };
+ template<typename _Up>
+ static __one __test(_Wrap_type<typename _Up::iterator_category>*);
+ template<typename _Up>
+ static __two __test(...);
+ public:
+ static const bool __value = (sizeof(__test<_Tp>(0)) == 1
+ || __is_pointer<_Tp>::__value);
+ };
+ template<typename _Tp>
+ struct __is_iterator
+ {
+ enum { __value = __is_iterator_helper<_Tp>::__value };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<bool, typename>
+ struct __enable_if
+ { };
+ template<typename _Tp>
+ struct __enable_if<true, _Tp>
+ { typedef _Tp __type; };
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct __conditional_type
+ { typedef _Iftrue __type; };
+ template<typename _Iftrue, typename _Iffalse>
+ struct __conditional_type<false, _Iftrue, _Iffalse>
+ { typedef _Iffalse __type; };
+ template<typename _Tp>
+ struct __add_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __add_unsigned<char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<signed char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<short>
+ { typedef unsigned short __type; };
+ template<>
+ struct __add_unsigned<int>
+ { typedef unsigned int __type; };
+ template<>
+ struct __add_unsigned<long>
+ { typedef unsigned long __type; };
+ template<>
+ struct __add_unsigned<long long>
+ { typedef unsigned long long __type; };
+ template<>
+ struct __add_unsigned<bool>;
+ template<>
+ struct __add_unsigned<wchar_t>;
+ template<typename _Tp>
+ struct __remove_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __remove_unsigned<char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned short>
+ { typedef short __type; };
+ template<>
+ struct __remove_unsigned<unsigned int>
+ { typedef int __type; };
+ template<>
+ struct __remove_unsigned<unsigned long>
+ { typedef long __type; };
+ template<>
+ struct __remove_unsigned<unsigned long long>
+ { typedef long long __type; };
+ template<>
+ struct __remove_unsigned<bool>;
+ template<>
+ struct __remove_unsigned<wchar_t>;
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type* __ptr)
+ { return __ptr == 0; }
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type)
+ { return false; }
+ template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
+ struct __promote
+ { typedef double __type; };
+ template<typename _Tp>
+ struct __promote<_Tp, false>
+ { typedef _Tp __type; };
+ template<typename _Tp, typename _Up>
+ struct __promote_2
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ public:
+ typedef __typeof__(__type1() + __type2()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp>
+ struct __promote_3
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp, typename _Wp>
+ struct __promote_4
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ typedef typename __promote<_Wp>::__type __type4;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3() + __type4()) __type;
+ };
+}
+
+namespace __gnu_cxx {
+ template<typename _Value>
+ struct __numeric_traits_integer
+ {
+ static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0);
+ static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0);
+ static const bool __is_signed = ((_Value)(-1) < 0);
+ static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0));
+ };
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__min;
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__max;
+ template<typename _Value>
+ const bool __numeric_traits_integer<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_integer<_Value>::__digits;
+ template<typename _Value>
+ struct __numeric_traits_floating
+ {
+ static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 3010 / 10000);
+ static const bool __is_signed = true;
+ static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18);
+ static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932);
+ };
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_digits10;
+ template<typename _Value>
+ const bool __numeric_traits_floating<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__digits10;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_exponent10;
+ template<typename _Value>
+ struct __numeric_traits
+ : public __conditional_type<std::__is_integer<_Value>::__value,
+ __numeric_traits_integer<_Value>,
+ __numeric_traits_floating<_Value> >::__type
+ { };
+}
+
+
+namespace std {
+ struct input_iterator_tag { };
+ struct output_iterator_tag { };
+ struct forward_iterator_tag : public input_iterator_tag { };
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<const _Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ };
+ template<typename _Iter>
+ inline typename iterator_traits<_Iter>::iterator_category
+ __iterator_category(const _Iter&)
+ { return typename iterator_traits<_Iter>::iterator_category(); }
+}
+
+namespace std {
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ __distance(_InputIterator __first, _InputIterator __last,
+ input_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ while (__first != __last)
+ {
+ ++__first;
+ ++__n;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator>
+ inline typename iterator_traits<_RandomAccessIterator>::difference_type
+ __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ return __last - __first;
+ }
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ distance(_InputIterator __first, _InputIterator __last)
+ {
+ return std::__distance(__first, __last,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
+ {
+
+ while (__n--)
+ ++__i;
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ inline void
+ __advance(_BidirectionalIterator& __i, _Distance __n,
+ bidirectional_iterator_tag)
+ {
+
+ if (__n > 0)
+ while (__n--)
+ ++__i;
+ else
+ while (__n++)
+ --__i;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline void
+ __advance(_RandomAccessIterator& __i, _Distance __n,
+ random_access_iterator_tag)
+ {
+
+ __i += __n;
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ advance(_InputIterator& __i, _Distance __n)
+ {
+ typename iterator_traits<_InputIterator>::difference_type __d = __n;
+ std::__advance(__i, __d, std::__iterator_category(__i));
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::pointer pointer;
+ typedef typename __traits_type::reference reference;
+ reverse_iterator() : current() { }
+ explicit
+ reverse_iterator(iterator_type __x) : current(__x) { }
+ reverse_iterator(const reverse_iterator& __x)
+ : current(__x.current) { }
+ template<typename _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x)
+ : current(__x.base()) { }
+ iterator_type
+ base() const
+ { return current; }
+ reference
+ operator*() const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer
+ operator->() const
+ { return &(operator*()); }
+ reverse_iterator&
+ operator++()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator
+ operator++(int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator&
+ operator--()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator
+ operator--(int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator
+ operator+(difference_type __n) const
+ { return reverse_iterator(current - __n); }
+ reverse_iterator&
+ operator+=(difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator
+ operator-(difference_type __n) const
+ { return reverse_iterator(current + __n); }
+ reverse_iterator&
+ operator-=(difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference
+ operator[](difference_type __n) const
+ { return *(*this + __n); }
+ };
+ template<typename _Iterator>
+ inline bool
+ operator==(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator<(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator!=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x == __y); }
+ template<typename _Iterator>
+ inline bool
+ operator>(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y < __x; }
+ template<typename _Iterator>
+ inline bool
+ operator<=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__y < __x); }
+ template<typename _Iterator>
+ inline bool
+ operator>=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x < __y); }
+ template<typename _Iterator>
+ inline typename reverse_iterator<_Iterator>::difference_type
+ operator-(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Iterator>
+ inline reverse_iterator<_Iterator>
+ operator+(typename reverse_iterator<_Iterator>::difference_type __n,
+ const reverse_iterator<_Iterator>& __x)
+ { return reverse_iterator<_Iterator>(__x.base() - __n); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator==(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator!=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x == __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y < __x; }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__y < __x); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x < __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline typename reverse_iterator<_IteratorL>::difference_type
+ operator-(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Container>
+ class back_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit
+ back_insert_iterator(_Container& __x) : container(&__x) { }
+ back_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_back(__value);
+ return *this;
+ }
+ back_insert_iterator&
+ operator*()
+ { return *this; }
+ back_insert_iterator&
+ operator++()
+ { return *this; }
+ back_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline back_insert_iterator<_Container>
+ back_inserter(_Container& __x)
+ { return back_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class front_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit front_insert_iterator(_Container& __x) : container(&__x) { }
+ front_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_front(__value);
+ return *this;
+ }
+ front_insert_iterator&
+ operator*()
+ { return *this; }
+ front_insert_iterator&
+ operator++()
+ { return *this; }
+ front_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline front_insert_iterator<_Container>
+ front_inserter(_Container& __x)
+ { return front_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ typename _Container::iterator iter;
+ public:
+ typedef _Container container_type;
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x), iter(__i) {}
+ insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ iter = container->insert(iter, __value);
+ ++iter;
+ return *this;
+ }
+ insert_iterator&
+ operator*()
+ { return *this; }
+ insert_iterator&
+ operator++()
+ { return *this; }
+ insert_iterator&
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container, typename _Iterator>
+ inline insert_iterator<_Container>
+ inserter(_Container& __x, _Iterator __i)
+ {
+ return insert_iterator<_Container>(__x,
+ typename _Container::iterator(__i));
+ }
+}
+namespace __gnu_cxx {
+ using std::iterator_traits;
+ using std::iterator;
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ protected:
+ _Iterator _M_current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::iterator_category iterator_category;
+ typedef typename __traits_type::value_type value_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::reference reference;
+ typedef typename __traits_type::pointer pointer;
+ __normal_iterator() : _M_current(_Iterator()) { }
+ explicit
+ __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
+ template<typename _Iter>
+ __normal_iterator(const __normal_iterator<_Iter,
+ typename __enable_if<
+ (std::__are_same<_Iter, typename _Container::pointer>::__value),
+ _Container>::__type>& __i)
+ : _M_current(__i.base()) { }
+ reference
+ operator*() const
+ { return *_M_current; }
+ pointer
+ operator->() const
+ { return _M_current; }
+ __normal_iterator&
+ operator++()
+ {
+ ++_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator++(int)
+ { return __normal_iterator(_M_current++); }
+ __normal_iterator&
+ operator--()
+ {
+ --_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator--(int)
+ { return __normal_iterator(_M_current--); }
+ reference
+ operator[](const difference_type& __n) const
+ { return _M_current[__n]; }
+ __normal_iterator&
+ operator+=(const difference_type& __n)
+ { _M_current += __n; return *this; }
+ __normal_iterator
+ operator+(const difference_type& __n) const
+ { return __normal_iterator(_M_current + __n); }
+ __normal_iterator&
+ operator-=(const difference_type& __n)
+ { _M_current -= __n; return *this; }
+ __normal_iterator
+ operator-(const difference_type& __n) const
+ { return __normal_iterator(_M_current - __n); }
+ const _Iterator&
+ base() const
+ { return _M_current; }
+ };
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline typename __normal_iterator<_IteratorL, _Container>::difference_type
+ operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline typename __normal_iterator<_Iterator, _Container>::difference_type
+ operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline __normal_iterator<_Iterator, _Container>
+ operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
+ __n, const __normal_iterator<_Iterator, _Container>& __i)
+ { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
+}
+namespace std
+{
+ namespace __debug { }
+}
+namespace __gnu_debug
+{
+ using namespace std::__debug;
+}
+namespace std {
+ template<bool _BoolType>
+ struct __iter_swap
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ _ValueType1 __tmp = (*__a);
+ *__a = (*__b);
+ *__b = (__tmp);
+ }
+ };
+ template<>
+ struct __iter_swap<true>
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ swap(*__a, *__b);
+ }
+ };
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ typedef typename iterator_traits<_ForwardIterator1>::reference
+ _ReferenceType1;
+ typedef typename iterator_traits<_ForwardIterator2>::reference
+ _ReferenceType2;
+ std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value
+ && __are_same<_ValueType1&, _ReferenceType1>::__value
+ && __are_same<_ValueType2&, _ReferenceType2>::__value>::
+ iter_swap(__a, __b);
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator2
+ swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ std::iter_swap(__first1, __first2);
+ return __first2;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__b < __a)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__a < __b)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__b, __a))
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__a, __b))
+ return __b;
+ return __a;
+ }
+ template<typename _Iterator, bool _HasBase>
+ struct _Iter_base
+ {
+ typedef _Iterator iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it; }
+ };
+ template<typename _Iterator>
+ struct _Iter_base<_Iterator, true>
+ {
+ typedef typename _Iterator::iterator_type iterator_type;
+ static iterator_type
+ _S_base(_Iterator __it)
+ { return __it.base(); }
+ };
+ template<typename _Iterator>
+ struct _Niter_base
+ : _Iter_base<_Iterator, __is_normal_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Niter_base<_Iterator>::iterator_type
+ __niter_base(_Iterator __it)
+ { return std::_Niter_base<_Iterator>::_S_base(__it); }
+ template<typename _Iterator>
+ struct _Miter_base
+ : _Iter_base<_Iterator, __is_move_iterator<_Iterator>::__value>
+ { };
+ template<typename _Iterator>
+ inline typename _Miter_base<_Iterator>::iterator_type
+ __miter_base(_Iterator __it)
+ { return std::_Miter_base<_Iterator>::_S_base(__it); }
+ template<bool, bool, typename>
+ struct __copy_move
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ for (; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move<false, false, random_access_iterator_tag>
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::difference_type _Distance;
+ for(_Distance __n = __last - __first; __n > 0; --__n)
+ {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
+ return __result + _Num;
+ }
+ };
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::value_type _ValueTypeI;
+ typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
+ typedef typename iterator_traits<_II>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueTypeI)
+ && __is_pointer<_II>::__value
+ && __is_pointer<_OI>::__value
+ && __are_same<_ValueTypeI, _ValueTypeO>::__value);
+ return std::__copy_move<_IsMove, __simple,
+ _Category>::__copy_m(__first, __last, __result);
+ }
+ template<typename _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator;
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(_CharT*, _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(const _CharT*, const _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
+ istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a2(_II __first, _II __last, _OI __result)
+ {
+ return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first),
+ std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _II, typename _OI>
+ inline _OI
+ copy(_II __first, _II __last, _OI __result)
+ {
+
+
+ ;
+ return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<bool, bool, typename>
+ struct __copy_move_backward
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ while (__first != __last)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move_backward<false, false, random_access_iterator_tag>
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typename iterator_traits<_BI1>::difference_type __n;
+ for (__n = __last - __first; __n > 0; --__n)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ if (_Num)
+ __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
+ return __result - _Num;
+ }
+ };
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typedef typename iterator_traits<_BI1>::value_type _ValueType1;
+ typedef typename iterator_traits<_BI2>::value_type _ValueType2;
+ typedef typename iterator_traits<_BI1>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueType1)
+ && __is_pointer<_BI1>::__value
+ && __is_pointer<_BI2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__copy_move_backward<_IsMove, __simple,
+ _Category>::__copy_move_b(__first,
+ __last,
+ __result);
+ }
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ return _BI2(std::__copy_move_backward_a<_IsMove>
+ (std::__niter_base(__first), std::__niter_base(__last),
+ std::__niter_base(__result)));
+ }
+ template<typename _BI1, typename _BI2>
+ inline _BI2
+ copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+
+
+
+ ;
+ return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+ (std::__miter_base(__first), std::__miter_base(__last),
+ __result));
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ for (; __first != __last; ++__first)
+ *__first = __value;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __first != __last; ++__first)
+ *__first = __tmp;
+ }
+ template<typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
+ __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
+ {
+ const _Tp __tmp = __c;
+ __builtin_memset(__first, static_cast<unsigned char>(__tmp),
+ __last - __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ {
+
+ ;
+ std::__fill_a(std::__niter_base(__first), std::__niter_base(__last),
+ __value);
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ for (; __n > 0; --__n, ++__first)
+ *__first = __value;
+ return __first;
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __n > 0; --__n, ++__first)
+ *__first = __tmp;
+ return __first;
+ }
+ template<typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
+ __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
+ {
+ std::__fill_a(__first, __first + __n, __c);
+ return __first + __n;
+ }
+ template<typename _OI, typename _Size, typename _Tp>
+ inline _OI
+ fill_n(_OI __first, _Size __n, const _Tp& __value)
+ {
+
+ return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
+ }
+ template<bool _BoolType>
+ struct __equal
+ {
+ template<typename _II1, typename _II2>
+ static bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!(*__first1 == *__first2))
+ return false;
+ return true;
+ }
+ };
+ template<>
+ struct __equal<true>
+ {
+ template<typename _Tp>
+ static bool
+ equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
+ {
+ return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
+ * (__last1 - __first1));
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple = (__is_integer<_ValueType1>::__value
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__equal<__simple>::equal(__first1, __last1, __first2);
+ }
+ template<typename, typename>
+ struct __lc_rai
+ {
+ template<typename _II1, typename _II2>
+ static _II1
+ __newlast1(_II1, _II1 __last1, _II2, _II2)
+ { return __last1; }
+ template<typename _II>
+ static bool
+ __cnd2(_II __first, _II __last)
+ { return __first != __last; }
+ };
+ template<>
+ struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
+ {
+ template<typename _RAI1, typename _RAI2>
+ static _RAI1
+ __newlast1(_RAI1 __first1, _RAI1 __last1,
+ _RAI2 __first2, _RAI2 __last2)
+ {
+ const typename iterator_traits<_RAI1>::difference_type
+ __diff1 = __last1 - __first1;
+ const typename iterator_traits<_RAI2>::difference_type
+ __diff2 = __last2 - __first2;
+ return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
+ }
+ template<typename _RAI>
+ static bool
+ __cnd2(_RAI, _RAI)
+ { return true; }
+ };
+ template<bool _BoolType>
+ struct __lexicographical_compare
+ {
+ template<typename _II1, typename _II2>
+ static bool __lc(_II1, _II1, _II2, _II2);
+ };
+ template<bool _BoolType>
+ template<typename _II1, typename _II2>
+ bool
+ __lexicographical_compare<_BoolType>::
+ __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+ __last1 = __rai_type::__newlast1(__first1, __last1,
+ __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (*__first1 < *__first2)
+ return true;
+ if (*__first2 < *__first1)
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<>
+ struct __lexicographical_compare<true>
+ {
+ template<typename _Tp, typename _Up>
+ static bool
+ __lc(const _Tp* __first1, const _Tp* __last1,
+ const _Up* __first2, const _Up* __last2)
+ {
+ const size_t __len1 = __last1 - __first1;
+ const size_t __len2 = __last2 - __first2;
+ const int __result = __builtin_memcmp(__first1, __first2,
+ std::min(__len1, __len2));
+ return __result != 0 ? __result < 0 : __len1 < __len2;
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple =
+ (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value
+ && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed
+ && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value);
+ return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
+ __first2, __last2);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _Size>
+ inline _Size
+ __lg(_Size __n)
+ {
+ _Size __k;
+ for (__k = 0; __n != 0; __n >>= 1)
+ ++__k;
+ return __k - 1;
+ }
+ inline int
+ __lg(int __n)
+ { return sizeof(int) * 8 - 1 - __builtin_clz(__n); }
+ inline long
+ __lg(long __n)
+ { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); }
+ inline long long
+ __lg(long long __n)
+ { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); }
+}
+namespace std {
+ template<typename _II1, typename _II2>
+ inline bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+
+
+
+ ;
+ return std::__equal_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2));
+ }
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ inline bool
+ equal(_IIter1 __first1, _IIter1 __last1,
+ _IIter2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!bool(__binary_pred(*__first1, *__first2)))
+ return false;
+ return true;
+ }
+ template<typename _II1, typename _II2>
+ inline bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+
+
+
+
+ ;
+ ;
+ return std::__lexicographical_compare_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+ std::__niter_base(__first2),
+ std::__niter_base(__last2));
+ }
+ template<typename _II1, typename _II2, typename _Compare>
+ bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2, _Compare __comp)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+
+
+ ;
+ ;
+ __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (__comp(*__first1, *__first2))
+ return true;
+ if (__comp(*__first2, *__first1))
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2)
+ {
+
+
+
+ ;
+ while (__first1 != __last1 && *__first1 == *__first2)
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _BinaryPredicate>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ while (__first1 != __last1 && bool(__binary_pred(*__first1, *__first2)))
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+}
+
+
+extern "C" {
+typedef unsigned long __ULong;
+struct _reent;
+struct _Bigint
+{
+ struct _Bigint *_next;
+ int _k, _maxwds, _sign, _wds;
+ __ULong _x[1];
+};
+struct __tm
+{
+ int __tm_sec;
+ int __tm_min;
+ int __tm_hour;
+ int __tm_mday;
+ int __tm_mon;
+ int __tm_year;
+ int __tm_wday;
+ int __tm_yday;
+ int __tm_isdst;
+};
+struct _on_exit_args {
+ void * _fnargs[32];
+ void * _dso_handle[32];
+ __ULong _fntypes;
+ __ULong _is_cxa;
+};
+struct _atexit {
+ struct _atexit *_next;
+ int _ind;
+ void (*_fns[32])(void);
+ struct _on_exit_args _on_exit_args;
+};
+struct __sbuf {
+ unsigned char *_base;
+ int _size;
+};
+struct __sFILE {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _offset;
+ struct _reent *_data;
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+ int _flags2;
+};
+struct __sFILE64 {
+ unsigned char *_p;
+ int _r;
+ int _w;
+ short _flags;
+ short _file;
+ struct __sbuf _bf;
+ int _lbfsize;
+ struct _reent *_data;
+ void * _cookie;
+ _ssize_t (__attribute__((__cdecl__)) * _read) (struct _reent *, void *, char *, int);
+ _ssize_t (__attribute__((__cdecl__)) * _write) (struct _reent *, void *, const char *, int);
+ _fpos_t (__attribute__((__cdecl__)) * _seek) (struct _reent *, void *, _fpos_t, int);
+ int (__attribute__((__cdecl__)) * _close) (struct _reent *, void *);
+ struct __sbuf _ub;
+ unsigned char *_up;
+ int _ur;
+ unsigned char _ubuf[3];
+ unsigned char _nbuf[1];
+ struct __sbuf _lb;
+ int _blksize;
+ int _flags2;
+ _off64_t _offset;
+ _fpos64_t (__attribute__((__cdecl__)) * _seek64) (struct _reent *, void *, _fpos64_t, int);
+ _flock_t _lock;
+ _mbstate_t _mbstate;
+};
+typedef struct __sFILE64 __FILE;
+struct _glue
+{
+ struct _glue *_next;
+ int _niobs;
+ __FILE *_iobs;
+};
+struct _rand48 {
+ unsigned short _seed[3];
+ unsigned short _mult[3];
+ unsigned short _add;
+};
+struct _reent
+{
+ int _errno;
+ __FILE *_stdin, *_stdout, *_stderr;
+ int _inc;
+ char _emergency[25];
+ int _current_category;
+ const char *_current_locale;
+ int __sdidinit;
+ void (__attribute__((__cdecl__)) * __cleanup) (struct _reent *);
+ struct _Bigint *_result;
+ int _result_k;
+ struct _Bigint *_p5s;
+ struct _Bigint **_freelist;
+ int _cvtlen;
+ char *_cvtbuf;
+ union
+ {
+ struct
+ {
+ unsigned int _unused_rand;
+ char * _strtok_last;
+ char _asctime_buf[26];
+ struct __tm _localtime_buf;
+ int _gamma_signgam;
+ __extension__ unsigned long long _rand_next;
+ struct _rand48 _r48;
+ _mbstate_t _mblen_state;
+ _mbstate_t _mbtowc_state;
+ _mbstate_t _wctomb_state;
+ char _l64a_buf[8];
+ char _signal_buf[24];
+ int _getdate_err;
+ _mbstate_t _mbrlen_state;
+ _mbstate_t _mbrtowc_state;
+ _mbstate_t _mbsrtowcs_state;
+ _mbstate_t _wcrtomb_state;
+ _mbstate_t _wcsrtombs_state;
+ int _h_errno;
+ } _reent;
+ struct
+ {
+ unsigned char * _nextf[30];
+ unsigned int _nmalloc[30];
+ } _unused;
+ } _new;
+ struct _atexit *_atexit;
+ struct _atexit _atexit0;
+ void (**(_sig_func))(int);
+ struct _glue __sglue;
+ __FILE __sf[3];
+};
+extern struct _reent *_impure_ptr ;
+extern struct _reent *const _global_impure_ptr ;
+void _reclaim_reent (struct _reent *);
+ struct _reent * __attribute__((__cdecl__)) __getreent (void);
+}
+extern "C" {
+char *mkdtemp (char *);
+}
+extern "C"
+{
+const char *getprogname (void);
+void setprogname (const char *);
+char *realpath (const char *, char *);
+char *canonicalize_file_name (const char *);
+int unsetenv (const char *);
+char *initstate (unsigned seed, char *state, size_t size);
+long random (void);
+char *setstate (const char *state);
+void srandom (unsigned);
+char *ptsname (int);
+int grantpt (int);
+int unlockpt (int);
+int posix_openpt (int);
+int posix_memalign (void **, size_t, size_t);
+extern void * memalign (size_t, size_t);
+extern void * valloc (size_t);
+}
+extern "C" {
+typedef struct
+{
+ int quot;
+ int rem;
+} div_t;
+typedef struct
+{
+ long quot;
+ long rem;
+} ldiv_t;
+typedef struct
+{
+ long long int quot;
+ long long int rem;
+} lldiv_t;
+int __attribute__((__cdecl__)) __locale_mb_cur_max (void);
+void __attribute__((__cdecl__)) abort (void) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) abs (int);
+int __attribute__((__cdecl__)) atexit (void (*__func)(void));
+double __attribute__((__cdecl__)) atof (const char *__nptr);
+float __attribute__((__cdecl__)) atoff (const char *__nptr);
+int __attribute__((__cdecl__)) atoi (const char *__nptr);
+int __attribute__((__cdecl__)) _atoi_r (struct _reent *, const char *__nptr);
+long __attribute__((__cdecl__)) atol (const char *__nptr);
+long __attribute__((__cdecl__)) _atol_r (struct _reent *, const char *__nptr);
+void * __attribute__((__cdecl__)) bsearch (const void * __key, const void * __base, size_t __nmemb, size_t __size, int (__attribute__((__cdecl__)) * _compar) (const void *, const void *));
+void * __attribute__((__cdecl__)) calloc (size_t __nmemb, size_t __size) __attribute__ ((nothrow));
+div_t __attribute__((__cdecl__)) div (int __numer, int __denom);
+void __attribute__((__cdecl__)) exit (int __status) __attribute__ ((noreturn));
+void __attribute__((__cdecl__)) free (void *) __attribute__ ((nothrow));
+char * __attribute__((__cdecl__)) getenv (const char *__string);
+char * __attribute__((__cdecl__)) _getenv_r (struct _reent *, const char *__string);
+char * __attribute__((__cdecl__)) _findenv (const char *, int *);
+char * __attribute__((__cdecl__)) _findenv_r (struct _reent *, const char *, int *);
+extern char *suboptarg;
+int __attribute__((__cdecl__)) getsubopt (char **, char * const *, char **);
+long __attribute__((__cdecl__)) labs (long);
+ldiv_t __attribute__((__cdecl__)) ldiv (long __numer, long __denom);
+void * __attribute__((__cdecl__)) malloc (size_t __size) __attribute__ ((nothrow));
+int __attribute__((__cdecl__)) mblen (const char *, size_t);
+int __attribute__((__cdecl__)) _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) mbtowc (wchar_t *, const char *, size_t);
+int __attribute__((__cdecl__)) _mbtowc_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+int __attribute__((__cdecl__)) wctomb (char *, wchar_t);
+int __attribute__((__cdecl__)) _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) mbstowcs (wchar_t *, const char *, size_t);
+size_t __attribute__((__cdecl__)) _mbstowcs_r (struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *);
+size_t __attribute__((__cdecl__)) wcstombs (char *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) _wcstombs_r (struct _reent *, char *, const wchar_t *, size_t, _mbstate_t *);
+char * __attribute__((__cdecl__)) mkdtemp (char *);
+int __attribute__((__cdecl__)) mkostemp (char *, int);
+int __attribute__((__cdecl__)) mkostemps (char *, int, int);
+int __attribute__((__cdecl__)) mkstemp (char *);
+int __attribute__((__cdecl__)) mkstemps (char *, int);
+char * __attribute__((__cdecl__)) mktemp (char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+char * __attribute__((__cdecl__)) _mkdtemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkostemp_r (struct _reent *, char *, int);
+int __attribute__((__cdecl__)) _mkostemps_r (struct _reent *, char *, int, int);
+int __attribute__((__cdecl__)) _mkstemp_r (struct _reent *, char *);
+int __attribute__((__cdecl__)) _mkstemps_r (struct _reent *, char *, int);
+char * __attribute__((__cdecl__)) _mktemp_r (struct _reent *, char *) __attribute__ ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")));
+void __attribute__((__cdecl__)) qsort (void * __base, size_t __nmemb, size_t __size, int(*_compar)(const void *, const void *));
+int __attribute__((__cdecl__)) rand (void);
+void * __attribute__((__cdecl__)) realloc (void * __r, size_t __size) __attribute__ ((nothrow));
+void * __attribute__((__cdecl__)) reallocf (void * __r, size_t __size);
+void __attribute__((__cdecl__)) srand (unsigned __seed);
+double __attribute__((__cdecl__)) strtod (const char *__n, char **__end_PTR);
+double __attribute__((__cdecl__)) _strtod_r (struct _reent *,const char *__n, char **__end_PTR);
+float __attribute__((__cdecl__)) strtof (const char *__n, char **__end_PTR);
+long __attribute__((__cdecl__)) strtol (const char *__n, char **__end_PTR, int __base);
+long __attribute__((__cdecl__)) _strtol_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) strtoul (const char *__n, char **__end_PTR, int __base);
+unsigned long __attribute__((__cdecl__)) _strtoul_r (struct _reent *,const char *__n, char **__end_PTR, int __base);
+int __attribute__((__cdecl__)) system (const char *__string);
+long __attribute__((__cdecl__)) a64l (const char *__input);
+char * __attribute__((__cdecl__)) l64a (long __input);
+char * __attribute__((__cdecl__)) _l64a_r (struct _reent *,long __input);
+int __attribute__((__cdecl__)) on_exit (void (*__func)(int, void *),void * __arg);
+void __attribute__((__cdecl__)) _Exit (int __status) __attribute__ ((noreturn));
+int __attribute__((__cdecl__)) putenv (char *__string);
+int __attribute__((__cdecl__)) _putenv_r (struct _reent *, char *__string);
+void * __attribute__((__cdecl__)) _reallocf_r (struct _reent *, void *, size_t);
+int __attribute__((__cdecl__)) setenv (const char *__string, const char *__value, int __overwrite);
+int __attribute__((__cdecl__)) _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite);
+char * __attribute__((__cdecl__)) gcvt (double,int,char *);
+char * __attribute__((__cdecl__)) gcvtf (float,int,char *);
+char * __attribute__((__cdecl__)) fcvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) fcvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvt (double,int,int *,int *);
+char * __attribute__((__cdecl__)) ecvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) fcvtbuf (double, int, int*, int*, char *);
+char * __attribute__((__cdecl__)) ecvtf (float,int,int *,int *);
+char * __attribute__((__cdecl__)) dtoa (double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) rand_r (unsigned *__seed);
+double __attribute__((__cdecl__)) drand48 (void);
+double __attribute__((__cdecl__)) _drand48_r (struct _reent *);
+double __attribute__((__cdecl__)) erand48 (unsigned short [3]);
+double __attribute__((__cdecl__)) _erand48_r (struct _reent *, unsigned short [3]);
+long __attribute__((__cdecl__)) jrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _jrand48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) lcong48 (unsigned short [7]);
+void __attribute__((__cdecl__)) _lcong48_r (struct _reent *, unsigned short [7]);
+long __attribute__((__cdecl__)) lrand48 (void);
+long __attribute__((__cdecl__)) _lrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) mrand48 (void);
+long __attribute__((__cdecl__)) _mrand48_r (struct _reent *);
+long __attribute__((__cdecl__)) nrand48 (unsigned short [3]);
+long __attribute__((__cdecl__)) _nrand48_r (struct _reent *, unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) seed48 (unsigned short [3]);
+unsigned short *
+ __attribute__((__cdecl__)) _seed48_r (struct _reent *, unsigned short [3]);
+void __attribute__((__cdecl__)) srand48 (long);
+void __attribute__((__cdecl__)) _srand48_r (struct _reent *, long);
+long long __attribute__((__cdecl__)) atoll (const char *__nptr);
+long long __attribute__((__cdecl__)) _atoll_r (struct _reent *, const char *__nptr);
+long long __attribute__((__cdecl__)) llabs (long long);
+lldiv_t __attribute__((__cdecl__)) lldiv (long long __numer, long long __denom);
+long long __attribute__((__cdecl__)) strtoll (const char *__n, char **__end_PTR, int __base);
+long long __attribute__((__cdecl__)) _strtoll_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) strtoull (const char *__n, char **__end_PTR, int __base);
+unsigned long long __attribute__((__cdecl__)) _strtoull_r (struct _reent *, const char *__n, char **__end_PTR, int __base);
+char * __attribute__((__cdecl__)) _dtoa_r (struct _reent *, double, int, int, int *, int*, char**);
+int __attribute__((__cdecl__)) _system_r (struct _reent *, const char *);
+void __attribute__((__cdecl__)) __eprintf (const char *, const char *, unsigned int, const char *);
+}
+namespace std {
+ using ::div_t;
+ using ::ldiv_t;
+ using ::abort;
+ using ::abs;
+ using ::atexit;
+ using ::atof;
+ using ::atoi;
+ using ::atol;
+ using ::bsearch;
+ using ::calloc;
+ using ::div;
+ using ::exit;
+ using ::free;
+ using ::getenv;
+ using ::labs;
+ using ::ldiv;
+ using ::malloc;
+ using ::mblen;
+ using ::mbstowcs;
+ using ::mbtowc;
+ using ::qsort;
+ using ::rand;
+ using ::realloc;
+ using ::srand;
+ using ::strtod;
+ using ::strtol;
+ using ::strtoul;
+ using ::system;
+ using ::wcstombs;
+ using ::wctomb;
+ inline long
+ abs(long __i) { return labs(__i); }
+ inline ldiv_t
+ div(long __i, long __j) { return ldiv(__i, __j); }
+}
+
+
+namespace std {
+ template<typename _FIter, typename _Tp>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ bool
+ binary_search(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ copy(_IIter, _IIter, _OIter);
+ template<typename _BIter1, typename _BIter2>
+ _BIter2
+ copy_backward(_BIter1, _BIter1, _BIter2);
+ template<typename _FIter, typename _Tp>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ pair<_FIter, _FIter>
+ equal_range(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _FIter, typename _Tp>
+ void
+ fill(_FIter, _FIter, const _Tp&);
+ template<typename _OIter, typename _Size, typename _Tp>
+ _OIter
+ fill_n(_OIter, _Size, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _BIter>
+ void
+ inplace_merge(_BIter, _BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ void
+ inplace_merge(_BIter, _BIter, _BIter, _Compare);
+ template<typename _FIter1, typename _FIter2>
+ void
+ iter_swap(_FIter1, _FIter2);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ lower_bound(_FIter, _FIter, const _Tp&, _Compare);
+ template<typename _RAIter>
+ void
+ make_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ make_heap(_RAIter, _RAIter, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ max(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ max(const _Tp&, const _Tp&, _Compare);
+ template<typename _Tp>
+ const _Tp&
+ min(const _Tp&, const _Tp&);
+ template<typename _Tp, typename _Compare>
+ const _Tp&
+ min(const _Tp&, const _Tp&, _Compare);
+ template<typename _BIter>
+ bool
+ next_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ next_permutation(_BIter, _BIter, _Compare);
+ template<typename _IIter, typename _RAIter>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
+ template<typename _IIter, typename _RAIter, typename _Compare>
+ _RAIter
+ partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ pop_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ pop_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter>
+ bool
+ prev_permutation(_BIter, _BIter);
+ template<typename _BIter, typename _Compare>
+ bool
+ prev_permutation(_BIter, _BIter, _Compare);
+ template<typename _RAIter>
+ void
+ push_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ push_heap(_RAIter, _RAIter, _Compare);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ remove(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Predicate>
+ _FIter
+ remove_if(_FIter, _FIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ remove_copy(_IIter, _IIter, _OIter, const _Tp&);
+ template<typename _IIter, typename _OIter, typename _Predicate>
+ _OIter
+ remove_copy_if(_IIter, _IIter, _OIter, _Predicate);
+ template<typename _IIter, typename _OIter, typename _Tp>
+ _OIter
+ replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);
+ template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
+ _OIter
+ replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);
+ template<typename _BIter>
+ void
+ reverse(_BIter, _BIter);
+ template<typename _BIter, typename _OIter>
+ _OIter
+ reverse_copy(_BIter, _BIter, _OIter);
+ template<typename _FIter>
+ void
+ rotate(_FIter, _FIter, _FIter);
+ template<typename _FIter, typename _OIter>
+ _OIter
+ rotate_copy(_FIter, _FIter, _FIter, _OIter);
+ template<typename _RAIter>
+ void
+ sort_heap(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort_heap(_RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ stable_partition(_BIter, _BIter, _Predicate);
+ template<typename _Tp>
+ void
+ swap(_Tp&, _Tp&);
+ template<typename _Tp, size_t _Nm>
+ void
+ swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
+ template<typename _FIter1, typename _FIter2>
+ _FIter2
+ swap_ranges(_FIter1, _FIter1, _FIter2);
+ template<typename _FIter>
+ _FIter
+ unique(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ unique(_FIter, _FIter, _BinaryPredicate);
+ template<typename _FIter, typename _Tp>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&);
+ template<typename _FIter, typename _Tp, typename _Compare>
+ _FIter
+ upper_bound(_FIter, _FIter, const _Tp&, _Compare);
+}
+namespace std {
+ template<typename _FIter>
+ _FIter
+ adjacent_find(_FIter, _FIter);
+ template<typename _FIter, typename _BinaryPredicate>
+ _FIter
+ adjacent_find(_FIter, _FIter, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ typename iterator_traits<_IIter>::difference_type
+ count(_IIter, _IIter, const _Tp&);
+ template<typename _IIter, typename _Predicate>
+ typename iterator_traits<_IIter>::difference_type
+ count_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ equal(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ bool
+ equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Tp>
+ _IIter
+ find(_IIter, _IIter, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _IIter, typename _Predicate>
+ _IIter
+ find_if(_IIter, _IIter, _Predicate);
+ template<typename _IIter, typename _Funct>
+ _Funct
+ for_each(_IIter, _IIter, _Funct);
+ template<typename _FIter, typename _Generator>
+ void
+ generate(_FIter, _FIter, _Generator);
+ template<typename _OIter, typename _Size, typename _Generator>
+ _OIter
+ generate_n(_OIter, _Size, _Generator);
+ template<typename _IIter1, typename _IIter2>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _Compare>
+ bool
+ lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
+ template<typename _FIter>
+ _FIter
+ max_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ max_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _FIter>
+ _FIter
+ min_element(_FIter, _FIter);
+ template<typename _FIter, typename _Compare>
+ _FIter
+ min_element(_FIter, _FIter, _Compare);
+ template<typename _IIter1, typename _IIter2>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2);
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ pair<_IIter1, _IIter2>
+ mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
+ template<typename _RAIter>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ nth_element(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
+ template<typename _BIter, typename _Predicate>
+ _BIter
+ partition(_BIter, _BIter, _Predicate);
+ template<typename _RAIter>
+ void
+ random_shuffle(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Generator>
+ void
+ random_shuffle(_RAIter, _RAIter,
+ _Generator&);
+ template<typename _FIter, typename _Tp>
+ void
+ replace(_FIter, _FIter, const _Tp&, const _Tp&);
+ template<typename _FIter, typename _Predicate, typename _Tp>
+ void
+ replace_if(_FIter, _FIter, _Predicate, const _Tp&);
+ template<typename _FIter1, typename _FIter2>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2);
+ template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
+ _FIter1
+ search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+ template<typename _FIter, typename _Size, typename _Tp>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&);
+ template<typename _FIter, typename _Size, typename _Tp,
+ typename _BinaryPredicate>
+ _FIter
+ search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
+ _OIter, _Compare);
+ template<typename _IIter1, typename _IIter2, typename _OIter>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _Compare>
+ _OIter
+ set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
+ template<typename _RAIter>
+ void
+ sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ sort(_RAIter, _RAIter, _Compare);
+ template<typename _RAIter>
+ void
+ stable_sort(_RAIter, _RAIter);
+ template<typename _RAIter, typename _Compare>
+ void
+ stable_sort(_RAIter, _RAIter, _Compare);
+ template<typename _IIter, typename _OIter, typename _UnaryOperation>
+ _OIter
+ transform(_IIter, _IIter, _OIter, _UnaryOperation);
+ template<typename _IIter1, typename _IIter2, typename _OIter,
+ typename _BinaryOperation>
+ _OIter
+ transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);
+ template<typename _IIter, typename _OIter>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter);
+ template<typename _IIter, typename _OIter, typename _BinaryPredicate>
+ _OIter
+ unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
+}
+namespace std {
+ template<typename _RandomAccessIterator, typename _Distance>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__first[__parent] < __first[__child])
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ _Distance
+ __is_heap_until(_RandomAccessIterator __first, _Distance __n,
+ _Compare __comp)
+ {
+ _Distance __parent = 0;
+ for (_Distance __child = 1; __child < __n; ++__child)
+ {
+ if (__comp(__first[__parent], __first[__child]))
+ return __child;
+ if ((__child & 1) == 0)
+ ++__parent;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Distance __n)
+ { return std::__is_heap_until(__first, __n) == __n; }
+ template<typename _RandomAccessIterator, typename _Compare,
+ typename _Distance>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)
+ { return std::__is_heap_until(__first, __n, __comp) == __n; }
+ template<typename _RandomAccessIterator>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ { return std::__is_heap(__first, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline bool
+ __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ { return std::__is_heap(__first, __comp, std::distance(__first, __last)); }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __push_heap(_RandomAccessIterator __first,
+ _Distance __holeIndex, _Distance __topIndex, _Tp __value)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex && *(__first + __parent) < __value)
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value));
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
+ typename _Compare>
+ void
+ __push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __topIndex, _Tp __value, _Compare __comp)
+ {
+ _Distance __parent = (__holeIndex - 1) / 2;
+ while (__holeIndex > __topIndex
+ && __comp(*(__first + __parent), __value))
+ {
+ *(__first + __holeIndex) = (*(__first + __parent));
+ __holeIndex = __parent;
+ __parent = (__holeIndex - 1) / 2;
+ }
+ *(__first + __holeIndex) = (__value);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ ;
+ _ValueType __value = (*(__last - 1));
+ std::__push_heap(__first, _DistanceType((__last - __first) - 1),
+ _DistanceType(0), (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Tp, typename _Compare>
+ void
+ __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+ _Distance __len, _Tp __value, _Compare __comp)
+ {
+ const _Distance __topIndex = __holeIndex;
+ _Distance __secondChild = __holeIndex;
+ while (__secondChild < (__len - 1) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ if (__comp(*(__first + __secondChild),
+ *(__first + (__secondChild - 1))))
+ __secondChild--;
+ *(__first + __holeIndex) = (*(__first + __secondChild));
+ __holeIndex = __secondChild;
+ }
+ if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ {
+ __secondChild = 2 * (__secondChild + 1);
+ *(__first + __holeIndex) = (*(__first + (__secondChild - 1)));
+ __holeIndex = __secondChild - 1;
+ }
+ std::__push_heap(__first, __holeIndex, __topIndex,
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomAccessIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+ _ValueType __value = (*__result);
+ *__result = (*__first);
+ std::__adjust_heap(__first, _DistanceType(0),
+ _DistanceType(__last - __first),
+ (__value), __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ pop_heap(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+
+ ;
+ ;
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value));
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+ ;
+ if (__last - __first < 2)
+ return;
+ const _DistanceType __len = __last - __first;
+ _DistanceType __parent = (__len - 2) / 2;
+ while (true)
+ {
+ _ValueType __value = (*(__first + __parent));
+ std::__adjust_heap(__first, __parent, __len, (__value),
+ __comp);
+ if (__parent == 0)
+ return;
+ __parent--;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+
+ ;
+ ;
+ while (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
+ }
+}
+
+
+
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class exception
+ {
+ public:
+ exception() throw() { }
+ virtual ~exception() throw();
+ virtual const char* what() const throw();
+ };
+ class bad_exception : public exception
+ {
+ public:
+ bad_exception() throw() { }
+ virtual ~bad_exception() throw();
+ virtual const char* what() const throw();
+ };
+ typedef void (*terminate_handler) ();
+ typedef void (*unexpected_handler) ();
+ terminate_handler set_terminate(terminate_handler) throw();
+ void terminate() throw() __attribute__ ((__noreturn__));
+ unexpected_handler set_unexpected(unexpected_handler) throw();
+ void unexpected() __attribute__ ((__noreturn__));
+ bool uncaught_exception() throw() __attribute__ ((__pure__));
+}
+namespace __gnu_cxx {
+ void __verbose_terminate_handler();
+}
+}
+#pragma GCC visibility pop
+#pragma GCC visibility push(default)
+extern "C++" {
+namespace std
+{
+ class bad_alloc : public exception
+ {
+ public:
+ bad_alloc() throw() { }
+ virtual ~bad_alloc() throw();
+ virtual const char* what() const throw();
+ };
+ struct nothrow_t { };
+ extern const nothrow_t nothrow;
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler) throw();
+}
+void* operator new(std::size_t) throw (std::bad_alloc);
+void* operator new[](std::size_t) throw (std::bad_alloc);
+void operator delete(void*) throw();
+void operator delete[](void*) throw();
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { }
+inline void operator delete[](void*, void*) throw() { }
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _T1, typename _T2>
+ inline void
+ _Construct(_T1* __p, const _T2& __value)
+ {
+ ::new(static_cast<void*>(__p)) _T1((__value));
+ }
+ template<typename _Tp>
+ inline void
+ _Destroy(_Tp* __pointer)
+ { __pointer->~_Tp(); }
+ template<bool>
+ struct _Destroy_aux
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ for (; __first != __last; ++__first)
+ std::_Destroy(&*__first);
+ }
+ };
+ template<>
+ struct _Destroy_aux<true>
+ {
+ template<typename _ForwardIterator>
+ static void
+ __destroy(_ForwardIterator, _ForwardIterator) { }
+ };
+ template<typename _ForwardIterator>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _Value_type;
+ std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
+ __destroy(__first, __last);
+ }
+ template <typename _Tp> class allocator;
+ template<typename _ForwardIterator, typename _Allocator>
+ void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ _Allocator& __alloc)
+ {
+ for (; __first != __last; ++__first)
+ __alloc.destroy(&*__first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+ allocator<_Tp>&)
+ {
+ _Destroy(__first, __last);
+ }
+}
+namespace std {
+ template<bool>
+ struct __uninitialized_copy
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ std::_Construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_copy<true>
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ { return std::copy(__first, __last, __result); }
+ };
+ template<typename _InputIterator, typename _ForwardIterator>
+ inline _ForwardIterator
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType2;
+ return std::__uninitialized_copy<(__is_pod(_ValueType1)
+ && __is_pod(_ValueType2))>::
+ uninitialized_copy(__first, __last, __result);
+ }
+ template<bool>
+ struct __uninitialized_fill
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ uninitialized_fill(_ForwardIterator __first,
+ _ForwardIterator __last, const _Tp& __x)
+ { std::fill(__first, __last, __x); }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill<__is_pod(_ValueType)>::
+ uninitialized_fill(__first, __last, __x);
+ }
+ template<bool>
+ struct __uninitialized_construct_range_dispatch
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator __first, _ForwardIterator __last,
+ _Tp& __value)
+ {
+ if(__first == __last)
+ return;
+ _ForwardIterator __cur = __first;
+ try
+ {
+ std::_Construct(&*__first, (__value));
+ _ForwardIterator __prev = __cur;
+ ++__cur;
+ for(; __cur != __last; ++__cur, ++__prev)
+ std::_Construct(&*__cur, (*__prev));
+ __value = (*__prev);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_construct_range_dispatch<true>
+ {
+ template<typename _ForwardIterator, typename _Tp>
+ static void
+ __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ __uninitialized_construct_range(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Tp& __value)
+ {
+ typedef typename std::iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_construct_range_dispatch<
+ __has_trivial_constructor(_ValueType)>::
+ __ucr(__first, __last, __value);
+ }
+ template<bool>
+ struct __uninitialized_fill_n
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ std::_Construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur);
+ throw;
+ }
+ }
+ };
+ template<>
+ struct __uninitialized_fill_n<true>
+ {
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ static void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n,
+ const _Tp& __x)
+ { std::fill_n(__first, __n, __x); }
+ };
+ template<typename _ForwardIterator, typename _Size, typename _Tp>
+ inline void
+ uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ std::__uninitialized_fill_n<__is_pod(_ValueType)>::
+ uninitialized_fill_n(__first, __n, __x);
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __result;
+ try
+ {
+ for (; __first != __last; ++__first, ++__cur)
+ __alloc.construct(&*__cur, *__first);
+ return __cur;
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
+ inline _ForwardIterator
+ __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, allocator<_Tp>&)
+ { return std::uninitialized_copy(__first, __last, __result); }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _Allocator& __alloc)
+ {
+ return std::__uninitialized_copy_a((__first),
+ (__last),
+ __result, __alloc);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Allocator>
+ void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __cur != __last; ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Tp2>
+ inline void
+ __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill(__first, __last, __x); }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Allocator>
+ void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, _Allocator& __alloc)
+ {
+ _ForwardIterator __cur = __first;
+ try
+ {
+ for (; __n > 0; --__n, ++__cur)
+ __alloc.construct(&*__cur, __x);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first, __cur, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Size, typename _Tp,
+ typename _Tp2>
+ inline void
+ __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
+ const _Tp& __x, allocator<_Tp2>&)
+ { std::uninitialized_fill_n(__first, __n, __x); }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_copy_move(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _ForwardIterator, typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_move_copy(_InputIterator1 __first1,
+ _InputIterator1 __last1,
+ _InputIterator2 __first2,
+ _InputIterator2 __last2,
+ _ForwardIterator __result,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
+ __result,
+ __alloc);
+ try
+ {
+ return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
+ typename _Allocator>
+ inline _ForwardIterator
+ __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
+ const _Tp& __x, _InputIterator __first,
+ _InputIterator __last, _Allocator& __alloc)
+ {
+ std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
+ try
+ {
+ return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__result, __mid, __alloc);
+ throw;
+ }
+ }
+ template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
+ typename _Allocator>
+ inline void
+ __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2,
+ _ForwardIterator __last2, const _Tp& __x,
+ _Allocator& __alloc)
+ {
+ _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
+ __first2,
+ __alloc);
+ try
+ {
+ std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
+ }
+ catch(...)
+ {
+ std::_Destroy(__first2, __mid2, __alloc);
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Tp>
+ pair<_Tp*, ptrdiff_t>
+ get_temporary_buffer(ptrdiff_t __len)
+ {
+ const ptrdiff_t __max =
+ __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
+ if (__len > __max)
+ __len = __max;
+ while (__len > 0)
+ {
+ _Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
+ std::nothrow));
+ if (__tmp != 0)
+ return std::pair<_Tp*, ptrdiff_t>(__tmp, __len);
+ __len /= 2;
+ }
+ return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
+ }
+ template<typename _Tp>
+ inline void
+ return_temporary_buffer(_Tp* __p)
+ { ::operator delete(__p, std::nothrow); }
+ template<typename _ForwardIterator, typename _Tp>
+ class _Temporary_buffer
+ {
+
+ public:
+ typedef _Tp value_type;
+ typedef value_type* pointer;
+ typedef pointer iterator;
+ typedef ptrdiff_t size_type;
+ protected:
+ size_type _M_original_len;
+ size_type _M_len;
+ pointer _M_buffer;
+ public:
+ size_type
+ size() const
+ { return _M_len; }
+ size_type
+ requested_size() const
+ { return _M_original_len; }
+ iterator
+ begin()
+ { return _M_buffer; }
+ iterator
+ end()
+ { return _M_buffer + _M_len; }
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last);
+ ~_Temporary_buffer()
+ {
+ std::_Destroy(_M_buffer, _M_buffer + _M_len);
+ std::return_temporary_buffer(_M_buffer);
+ }
+ private:
+ _Temporary_buffer(const _Temporary_buffer&);
+ void
+ operator=(const _Temporary_buffer&);
+ };
+ template<typename _ForwardIterator, typename _Tp>
+ _Temporary_buffer<_ForwardIterator, _Tp>::
+ _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+ : _M_original_len(std::distance(__first, __last)),
+ _M_len(0), _M_buffer(0)
+ {
+ try
+ {
+ std::pair<pointer, size_type> __p(std::get_temporary_buffer<
+ value_type>(_M_original_len));
+ _M_buffer = __p.first;
+ _M_len = __p.second;
+ if(_M_buffer)
+ std::__uninitialized_construct_range(_M_buffer, _M_buffer + _M_len,
+ *__first);
+ }
+ catch(...)
+ {
+ std::return_temporary_buffer(_M_buffer);
+ _M_buffer = 0;
+ _M_len = 0;
+ throw;
+ }
+ }
+}
+namespace std {
+ template<typename _Iterator>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
+ {
+
+ if (*__a < *__b)
+ {
+ if (*__b < *__c)
+ std::iter_swap(__a, __b);
+ else if (*__a < *__c)
+ std::iter_swap(__a, __c);
+ }
+ else if (*__a < *__c)
+ return;
+ else if (*__b < *__c)
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _Iterator, typename _Compare>
+ void
+ __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
+ _Compare __comp)
+ {
+
+ if (__comp(*__a, *__b))
+ {
+ if (__comp(*__b, *__c))
+ std::iter_swap(__a, __b);
+ else if (__comp(*__a, *__c))
+ std::iter_swap(__a, __c);
+ }
+ else if (__comp(*__a, *__c))
+ return;
+ else if (__comp(*__b, *__c))
+ std::iter_swap(__a, __c);
+ else
+ std::iter_swap(__a, __b);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ __find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val, input_iterator_tag)
+ {
+ while (__first != __last && !(*__first == __val))
+ ++__first;
+ return __first;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ __find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred, input_iterator_tag)
+ {
+ while (__first != __last && !bool(__pred(*__first)))
+ ++__first;
+ return __first;
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ const _Tp& __val, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 2:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 1:
+ if (*__first == __val)
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Predicate>
+ _RandomAccessIterator
+ __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Predicate __pred, random_access_iterator_tag)
+ {
+ typename iterator_traits<_RandomAccessIterator>::difference_type
+ __trip_count = (__last - __first) >> 2;
+ for (; __trip_count > 0; --__trip_count)
+ {
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ }
+ switch (__last - __first)
+ {
+ case 3:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 2:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 1:
+ if (__pred(*__first))
+ return __first;
+ ++__first;
+ case 0:
+ default:
+ return __last;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ std::forward_iterator_tag)
+ {
+ __first = std::find(__first, __last, __val);
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && *__i == __val)
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = std::find(++__i, __last, __val);
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!(*__lookAhead == __val))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ *__backTrack == __val; --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::forward_iterator_tag)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ while (__first != __last)
+ {
+ typename iterator_traits<_ForwardIterator>::difference_type
+ __n = __count;
+ _ForwardIterator __i = __first;
+ ++__i;
+ while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
+ {
+ ++__i;
+ --__n;
+ }
+ if (__n == 1)
+ return __first;
+ if (__i == __last)
+ return __last;
+ __first = ++__i;
+ while (__first != __last
+ && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ }
+ return __last;
+ }
+ template<typename _RandomAccessIter, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _RandomAccessIter
+ __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
+ {
+ typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
+ _DistanceType;
+ _DistanceType __tailSize = __last - __first;
+ const _DistanceType __pattSize = __count;
+ if (__tailSize < __pattSize)
+ return __last;
+ const _DistanceType __skipOffset = __pattSize - 1;
+ _RandomAccessIter __lookAhead = __first + __skipOffset;
+ __tailSize -= __pattSize;
+ while (1)
+ {
+ while (!bool(__binary_pred(*__lookAhead, __val)))
+ {
+ if (__tailSize < __pattSize)
+ return __last;
+ __lookAhead += __pattSize;
+ __tailSize -= __pattSize;
+ }
+ _DistanceType __remainder = __skipOffset;
+ for (_RandomAccessIter __backTrack = __lookAhead - 1;
+ __binary_pred(*__backTrack, __val); --__backTrack)
+ {
+ if (--__remainder == 0)
+ return (__lookAhead - __skipOffset);
+ }
+ if (__remainder > __tailSize)
+ return __last;
+ __lookAhead += __remainder;
+ __tailSize -= __remainder;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2, __last2);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ forward_iterator_tag, forward_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+ if (__first2 == __last2)
+ return __last1;
+ else
+ {
+ _ForwardIterator1 __result = __last1;
+ while (1)
+ {
+ _ForwardIterator1 __new_result
+ = std::search(__first1, __last1, __first2,
+ __last2, __comp);
+ if (__new_result == __last1)
+ return __result;
+ else
+ {
+ __result = __new_result;
+ __first1 = __new_result;
+ ++__first1;
+ }
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1),
+ __rlast1,
+ _RevIterator2(__last2),
+ __rlast2);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BinaryPredicate>
+ _BidirectionalIterator1
+ __find_end(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ bidirectional_iterator_tag, bidirectional_iterator_tag,
+ _BinaryPredicate __comp)
+ {
+
+
+ typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
+ typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
+ _RevIterator1 __rlast1(__first1);
+ _RevIterator2 __rlast2(__first2);
+ _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
+ _RevIterator2(__last2), __rlast2,
+ __comp);
+ if (__rresult == __rlast1)
+ return __last1;
+ else
+ {
+ _BidirectionalIterator1 __result = __rresult.base();
+ std::advance(__result, -std::distance(__first2, __last2));
+ return __result;
+ }
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2));
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ inline _ForwardIterator1
+ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ return std::__find_end(__first1, __last1, __first2, __last2,
+ std::__iterator_category(__first1),
+ std::__iterator_category(__first2),
+ __comp);
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ remove_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, const _Tp& __value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!(*__first == __value))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate>
+ _OutputIterator
+ remove_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _Predicate __pred)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (!bool(__pred(*__first)))
+ {
+ *__result = *__first;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ remove(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+
+
+ ;
+ __first = std::find(__first, __last, __value);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!(*__first == __value))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ remove_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ __first = std::find_if(__first, __last, __pred);
+ if(__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ ++__first;
+ for(; __first != __last; ++__first)
+ if(!bool(__pred(*__first)))
+ {
+ *__result = (*__first);
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!(*__dest == *__first))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ unique(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ __first = std::adjacent_find(__first, __last, __binary_pred);
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __dest = __first;
+ ++__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__dest, *__first)))
+ *++__dest = (*__first);
+ return ++__dest;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result,
+ forward_iterator_tag, output_iterator_tag)
+ {
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!(*__first == *__next))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ input_iterator_tag, output_iterator_tag)
+ {
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!(__value == *__first))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result,
+ input_iterator_tag, forward_iterator_tag)
+ {
+ *__result = *__first;
+ while (++__first != __last)
+ if (!(*__result == *__first))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _ForwardIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ forward_iterator_tag, output_iterator_tag)
+ {
+
+ _ForwardIterator __next = __first;
+ *__result = *__first;
+ while (++__next != __last)
+ if (!bool(__binary_pred(*__first, *__next)))
+ {
+ __first = __next;
+ *++__result = *__first;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ _OutputIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, output_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::value_type __value = *__first;
+ *__result = __value;
+ while (++__first != __last)
+ if (!bool(__binary_pred(__value, *__first)))
+ {
+ __value = *__first;
+ *++__result = __value;
+ }
+ return ++__result;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ __unique_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result, _BinaryPredicate __binary_pred,
+ input_iterator_tag, forward_iterator_tag)
+ {
+
+ *__result = *__first;
+ while (++__first != __last)
+ if (!bool(__binary_pred(*__result, *__first)))
+ *++__result = *__first;
+ return ++__result;
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+ while (true)
+ if (__first == __last || __first == --__last)
+ return;
+ else
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+ if (__first == __last)
+ return;
+ --__last;
+ while (__first < __last)
+ {
+ std::iter_swap(__first, __last);
+ ++__first;
+ --__last;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ inline void
+ reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
+ {
+
+ ;
+ std::__reverse(__first, __last, std::__iterator_category(__first));
+ }
+ template<typename _BidirectionalIterator, typename _OutputIterator>
+ _OutputIterator
+ reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _OutputIterator __result)
+ {
+
+
+ ;
+ while (__first != __last)
+ {
+ --__last;
+ *__result = *__last;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _EuclideanRingElement>
+ _EuclideanRingElement
+ __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
+ {
+ while (__n != 0)
+ {
+ _EuclideanRingElement __t = __m % __n;
+ __m = __n;
+ __n = __t;
+ }
+ return __m;
+ }
+ template<typename _ForwardIterator>
+ void
+ __rotate(_ForwardIterator __first,
+ _ForwardIterator __middle,
+ _ForwardIterator __last,
+ forward_iterator_tag)
+ {
+ if (__first == __middle || __last == __middle)
+ return;
+ _ForwardIterator __first2 = __middle;
+ do
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ }
+ while (__first2 != __last);
+ __first2 = __middle;
+ while (__first2 != __last)
+ {
+ std::iter_swap(__first, __first2);
+ ++__first;
+ ++__first2;
+ if (__first == __middle)
+ __middle = __first2;
+ else if (__first2 == __last)
+ __first2 = __middle;
+ }
+ }
+ template<typename _BidirectionalIterator>
+ void
+ __rotate(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ bidirectional_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ while (__first != __middle && __middle != __last)
+ {
+ std::iter_swap(__first, --__last);
+ ++__first;
+ }
+ if (__first == __middle)
+ std::__reverse(__middle, __last, bidirectional_iterator_tag());
+ else
+ std::__reverse(__first, __middle, bidirectional_iterator_tag());
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __rotate(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ if (__first == __middle || __last == __middle)
+ return;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ _Distance __n = __last - __first;
+ _Distance __k = __middle - __first;
+ if (__k == __n - __k)
+ {
+ std::swap_ranges(__first, __middle, __middle);
+ return;
+ }
+ _RandomAccessIterator __p = __first;
+ for (;;)
+ {
+ if (__k < __n - __k)
+ {
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*__p);
+ std::copy(__p + 1, __p + __n, __p);
+ *(__p + __n - 1) = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ std::iter_swap(__p, __q);
+ ++__p;
+ ++__q;
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ __k = __n - __k;
+ }
+ else
+ {
+ __k = __n - __k;
+ if (__is_pod(_ValueType) && __k == 1)
+ {
+ _ValueType __t = (*(__p + __n - 1));
+ std::copy_backward(__p, __p + __n - 1, __p + __n);
+ *__p = (__t);
+ return;
+ }
+ _RandomAccessIterator __q = __p + __n;
+ __p = __q - __k;
+ for (_Distance __i = 0; __i < __n - __k; ++ __i)
+ {
+ --__p;
+ --__q;
+ std::iter_swap(__p, __q);
+ }
+ __n %= __k;
+ if (__n == 0)
+ return;
+ std::swap(__n, __k);
+ }
+ }
+ }
+ template<typename _ForwardIterator>
+ inline void
+ rotate(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last)
+ {
+
+ ;
+ ;
+ typedef typename iterator_traits<_ForwardIterator>::iterator_category
+ _IterType;
+ std::__rotate(__first, __middle, __last, _IterType());
+ }
+ template<typename _ForwardIterator, typename _OutputIterator>
+ _OutputIterator
+ rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
+ _ForwardIterator __last, _OutputIterator __result)
+ {
+
+
+ ;
+ ;
+ return std::copy(__first, __middle,
+ std::copy(__middle, __last, __result));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ __partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, forward_iterator_tag)
+ {
+ if (__first == __last)
+ return __first;
+ while (__pred(*__first))
+ if (++__first == __last)
+ return __first;
+ _ForwardIterator __next = __first;
+ while (++__next != __last)
+ if (__pred(*__next))
+ {
+ std::iter_swap(__first, __next);
+ ++__first;
+ }
+ return __first;
+ }
+ template<typename _BidirectionalIterator, typename _Predicate>
+ _BidirectionalIterator
+ __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
+ _Predicate __pred, bidirectional_iterator_tag)
+ {
+ while (true)
+ {
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (__pred(*__first))
+ ++__first;
+ else
+ break;
+ --__last;
+ while (true)
+ if (__first == __last)
+ return __first;
+ else if (!bool(__pred(*__last)))
+ --__last;
+ else
+ break;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Distance>
+ _ForwardIterator
+ __inplace_stable_partition(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len)
+ {
+ if (__len == 1)
+ return __pred(*__first) ? __last : __first;
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin = std::__inplace_stable_partition(__first,
+ __middle,
+ __pred,
+ __len / 2);
+ _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
+ __pred,
+ __len
+ - __len / 2);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
+ typename _Distance>
+ _ForwardIterator
+ __stable_partition_adaptive(_ForwardIterator __first,
+ _ForwardIterator __last,
+ _Predicate __pred, _Distance __len,
+ _Pointer __buffer,
+ _Distance __buffer_size)
+ {
+ if (__len <= __buffer_size)
+ {
+ _ForwardIterator __result1 = __first;
+ _Pointer __result2 = __buffer;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ {
+ *__result1 = (*__first);
+ ++__result1;
+ }
+ else
+ {
+ *__result2 = (*__first);
+ ++__result2;
+ }
+ std::copy(__buffer, __result2, __result1);
+ return __result1;
+ }
+ else
+ {
+ _ForwardIterator __middle = __first;
+ std::advance(__middle, __len / 2);
+ _ForwardIterator __begin =
+ std::__stable_partition_adaptive(__first, __middle, __pred,
+ __len / 2, __buffer,
+ __buffer_size);
+ _ForwardIterator __end =
+ std::__stable_partition_adaptive(__middle, __last, __pred,
+ __len - __len / 2,
+ __buffer, __buffer_size);
+ std::rotate(__begin, __middle, __end);
+ std::advance(__begin, std::distance(__middle, __end));
+ return __begin;
+ }
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ _ForwardIterator
+ stable_partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ else
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+ _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.size() > 0)
+ return
+ std::__stable_partition_adaptive(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()),
+ __buf.begin(),
+ _DistanceType(__buf.size()));
+ else
+ return
+ std::__inplace_stable_partition(__first, __last, __pred,
+ _DistanceType(__buf.requested_size()));
+ }
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ std::make_heap(__first, __middle);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (*__i < *__first)
+ std::__pop_heap(__first, __middle, __i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __heap_select(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ std::make_heap(__first, __middle, __comp);
+ for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
+ if (__comp(*__i, *__first))
+ std::__pop_heap(__first, __middle, __i, __comp);
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last);
+ while (__first != __last)
+ {
+ if (*__first < *__result_first)
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first));
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last);
+ return __result_real_last;
+ }
+ template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
+ _RandomAccessIterator
+ partial_sort_copy(_InputIterator __first, _InputIterator __last,
+ _RandomAccessIterator __result_first,
+ _RandomAccessIterator __result_last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator>::value_type
+ _InputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _OutputValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+
+
+
+ ;
+ ;
+ if (__result_first == __result_last)
+ return __result_last;
+ _RandomAccessIterator __result_real_last = __result_first;
+ while(__first != __last && __result_real_last != __result_last)
+ {
+ *__result_real_last = *__first;
+ ++__result_real_last;
+ ++__first;
+ }
+ std::make_heap(__result_first, __result_real_last, __comp);
+ while (__first != __last)
+ {
+ if (__comp(*__first, *__result_first))
+ std::__adjust_heap(__result_first, _DistanceType(0),
+ _DistanceType(__result_real_last
+ - __result_first),
+ _InputValueType(*__first),
+ __comp);
+ ++__first;
+ }
+ std::sort_heap(__result_first, __result_real_last, __comp);
+ return __result_real_last;
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__val < *__next)
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __unguarded_linear_insert(_RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__last);
+ _RandomAccessIterator __next = __last;
+ --__next;
+ while (__comp(__val, *__next))
+ {
+ *__last = (*__next);
+ __last = __next;
+ --__next;
+ }
+ *__last = (__val);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (*__i < *__first)
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__first == __last) return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (__comp(*__i, *__first))
+ {
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val = (*__i);
+ std::copy_backward(__first, __i, __i + 1);
+ *__first = (__val);
+ }
+ else
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __unguarded_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
+ std::__unguarded_linear_insert(__i, __comp);
+ }
+ enum { _S_threshold = 16 };
+ template<typename _RandomAccessIterator>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold));
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
+ }
+ else
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __final_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first > int(_S_threshold))
+ {
+ std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
+ std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
+ __comp);
+ }
+ else
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Tp>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, const _Tp& __pivot)
+ {
+ while (true)
+ {
+ while (*__first < __pivot)
+ ++__first;
+ --__last;
+ while (__pivot < *__last)
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
+ _RandomAccessIterator
+ __unguarded_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ const _Tp& __pivot, _Compare __comp)
+ {
+ while (true)
+ {
+ while (__comp(*__first, __pivot))
+ ++__first;
+ --__last;
+ while (__comp(__pivot, *__last))
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+ template<typename _RandomAccessIterator>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1));
+ return std::__unguarded_partition(__first + 1, __last, *__first);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline _RandomAccessIterator
+ __unguarded_partition_pivot(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2;
+ std::__move_median_first(__first, __mid, (__last - 1), __comp);
+ return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ std::__introsort_loop(__cut, __last, __depth_limit);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introsort_loop(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Size __depth_limit, _Compare __comp)
+ {
+ while (__last - __first > int(_S_threshold))
+ {
+ if (__depth_limit == 0)
+ {
+ std::partial_sort(__first, __last, __last, __comp);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ std::__introsort_loop(__cut, __last, __depth_limit, __comp);
+ __last = __cut;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Size>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Size, typename _Compare>
+ void
+ __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Size __depth_limit,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ while (__last - __first > 3)
+ {
+ if (__depth_limit == 0)
+ {
+ std::__heap_select(__first, __nth + 1, __last, __comp);
+ std::iter_swap(__first, __nth);
+ return;
+ }
+ --__depth_limit;
+ _RandomAccessIterator __cut =
+ std::__unguarded_partition_pivot(__first, __last, __comp);
+ if (__cut <= __nth)
+ __first = __cut;
+ else
+ __last = __cut;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ lower_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else
+ __len = __half;
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ _ForwardIterator
+ upper_bound(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ }
+ return __first;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (*__middle < __val)
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__val < *__middle)
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ pair<_ForwardIterator, _ForwardIterator>
+ equal_range(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_ForwardIterator>::difference_type
+ _DistanceType;
+
+
+
+ ;
+ ;
+ _DistanceType __len = std::distance(__first, __last);
+ _DistanceType __half;
+ _ForwardIterator __middle, __left, __right;
+ while (__len > 0)
+ {
+ __half = __len >> 1;
+ __middle = __first;
+ std::advance(__middle, __half);
+ if (__comp(*__middle, __val))
+ {
+ __first = __middle;
+ ++__first;
+ __len = __len - __half - 1;
+ }
+ else if (__comp(__val, *__middle))
+ __len = __half;
+ else
+ {
+ __left = std::lower_bound(__first, __middle, __val, __comp);
+ std::advance(__first, __len);
+ __right = std::upper_bound(++__middle, __first, __val, __comp);
+ return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
+ }
+ }
+ return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val);
+ return __i != __last && !(__val < *__i);
+ }
+ template<typename _ForwardIterator, typename _Tp, typename _Compare>
+ bool
+ binary_search(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __val, _Compare __comp)
+ {
+ typedef typename iterator_traits<_ForwardIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
+ return __i != __last && !bool(__comp(__val, *__i));
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (*__last2 < *__last1)
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _BidirectionalIterator3, typename _Compare>
+ _BidirectionalIterator3
+ __merge_backward(_BidirectionalIterator1 __first1,
+ _BidirectionalIterator1 __last1,
+ _BidirectionalIterator2 __first2,
+ _BidirectionalIterator2 __last2,
+ _BidirectionalIterator3 __result,
+ _Compare __comp)
+ {
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, __last2, __result);
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, __last1, __result);
+ --__last1;
+ --__last2;
+ while (true)
+ {
+ if (__comp(*__last2, *__last1))
+ {
+ *--__result = *__last1;
+ if (__first1 == __last1)
+ return std::copy_backward(__first2, ++__last2, __result);
+ --__last1;
+ }
+ else
+ {
+ *--__result = *__last2;
+ if (__first2 == __last2)
+ return std::copy_backward(__first1, ++__last1, __result);
+ --__last2;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
+ typename _Distance>
+ _BidirectionalIterator1
+ __rotate_adaptive(_BidirectionalIterator1 __first,
+ _BidirectionalIterator1 __middle,
+ _BidirectionalIterator1 __last,
+ _Distance __len1, _Distance __len2,
+ _BidirectionalIterator2 __buffer,
+ _Distance __buffer_size)
+ {
+ _BidirectionalIterator2 __buffer_end;
+ if (__len1 > __len2 && __len2 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__middle, __last, __buffer);
+ std::copy_backward(__first, __middle, __last);
+ return std::copy(__buffer, __buffer_end, __first);
+ }
+ else if (__len1 <= __buffer_size)
+ {
+ __buffer_end = std::copy(__first, __middle, __buffer);
+ std::copy(__middle, __last, __first);
+ return std::copy_backward(__buffer, __buffer_end, __last);
+ }
+ else
+ {
+ std::rotate(__first, __middle, __last);
+ std::advance(__first, std::distance(__middle, __last));
+ return __first;
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last,
+ *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle,
+ *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer, __buffer_size);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Pointer, typename _Compare>
+ void
+ __merge_adaptive(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ if (__len1 <= __len2 && __len1 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
+ std::merge((__buffer),
+ (__buffer_end),
+ (__middle),
+ (__last),
+ __first, __comp);
+ }
+ else if (__len2 <= __buffer_size)
+ {
+ _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
+ std::__merge_backward((__first),
+ (__middle),
+ (__buffer),
+ (__buffer_end),
+ __last,__comp);
+ }
+ else
+ {
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ _BidirectionalIterator __new_middle =
+ std::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ __len1 - __len11, __len22, __buffer,
+ __buffer_size);
+ std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
+ __len22, __buffer, __buffer_size, __comp);
+ std::__merge_adaptive(__new_middle, __second_cut, __last,
+ __len1 - __len11,
+ __len2 - __len22, __buffer,
+ __buffer_size, __comp);
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (*__middle < *__first)
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22);
+ }
+ template<typename _BidirectionalIterator, typename _Distance,
+ typename _Compare>
+ void
+ __merge_without_buffer(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Distance __len1, _Distance __len2,
+ _Compare __comp)
+ {
+ if (__len1 == 0 || __len2 == 0)
+ return;
+ if (__len1 + __len2 == 2)
+ {
+ if (__comp(*__middle, *__first))
+ std::iter_swap(__first, __middle);
+ return;
+ }
+ _BidirectionalIterator __first_cut = __first;
+ _BidirectionalIterator __second_cut = __middle;
+ _Distance __len11 = 0;
+ _Distance __len22 = 0;
+ if (__len1 > __len2)
+ {
+ __len11 = __len1 / 2;
+ std::advance(__first_cut, __len11);
+ __second_cut = std::lower_bound(__middle, __last, *__first_cut,
+ __comp);
+ __len22 = std::distance(__middle, __second_cut);
+ }
+ else
+ {
+ __len22 = __len2 / 2;
+ std::advance(__second_cut, __len22);
+ __first_cut = std::upper_bound(__first, __middle, *__second_cut,
+ __comp);
+ __len11 = std::distance(__first, __first_cut);
+ }
+ std::rotate(__first_cut, __middle, __second_cut);
+ _BidirectionalIterator __new_middle = __first_cut;
+ std::advance(__new_middle, std::distance(__middle, __second_cut));
+ std::__merge_without_buffer(__first, __first_cut, __new_middle,
+ __len11, __len22, __comp);
+ std::__merge_without_buffer(__new_middle, __second_cut, __last,
+ __len1 - __len11, __len2 - __len22, __comp);
+ }
+ template<typename _BidirectionalIterator>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ _DistanceType __len1 = std::distance(__first, __middle);
+ _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()));
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ void
+ inplace_merge(_BidirectionalIterator __first,
+ _BidirectionalIterator __middle,
+ _BidirectionalIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_BidirectionalIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_BidirectionalIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ ;
+ if (__first == __middle || __middle == __last)
+ return;
+ const _DistanceType __len1 = std::distance(__first, __middle);
+ const _DistanceType __len2 = std::distance(__middle, __last);
+ _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__merge_without_buffer(__first, __middle, __last, __len1,
+ __len2, __comp);
+ else
+ std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
+ __buf.begin(), _DistanceType(__buf.size()),
+ __comp);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result,
+ _Distance __step_size)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result);
+ }
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
+ typename _Distance, typename _Compare>
+ void
+ __merge_sort_loop(_RandomAccessIterator1 __first,
+ _RandomAccessIterator1 __last,
+ _RandomAccessIterator2 __result, _Distance __step_size,
+ _Compare __comp)
+ {
+ const _Distance __two_step = 2 * __step_size;
+ while (__last - __first >= __two_step)
+ {
+ __result = std::merge(
+ (__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__first + __two_step),
+ __result, __comp);
+ __first += __two_step;
+ }
+ __step_size = std::min(_Distance(__last - __first), __step_size);
+ std::merge((__first),
+ (__first + __step_size),
+ (__first + __step_size),
+ (__last),
+ __result, __comp);
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last);
+ }
+ template<typename _RandomAccessIterator, typename _Distance,
+ typename _Compare>
+ void
+ __chunk_insertion_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Distance __chunk_size, _Compare __comp)
+ {
+ while (__last - __first >= __chunk_size)
+ {
+ std::__insertion_sort(__first, __first + __chunk_size, __comp);
+ __first += __chunk_size;
+ }
+ std::__insertion_sort(__first, __last, __comp);
+ }
+ enum { _S_chunk_size = 7 };
+ template<typename _RandomAccessIterator, typename _Pointer>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer, __step_size);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
+ void
+ __merge_sort_with_buffer(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _Distance;
+ const _Distance __len = __last - __first;
+ const _Pointer __buffer_last = __buffer + __len;
+ _Distance __step_size = _S_chunk_size;
+ std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
+ while (__step_size < __len)
+ {
+ std::__merge_sort_loop(__first, __last, __buffer,
+ __step_size, __comp);
+ __step_size *= 2;
+ std::__merge_sort_loop(__buffer, __buffer_last, __first,
+ __step_size, __comp);
+ __step_size *= 2;
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle,
+ __buffer, __buffer_size);
+ std::__stable_sort_adaptive(__middle, __last,
+ __buffer, __buffer_size);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size);
+ }
+ template<typename _RandomAccessIterator, typename _Pointer,
+ typename _Distance, typename _Compare>
+ void
+ __stable_sort_adaptive(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Pointer __buffer, _Distance __buffer_size,
+ _Compare __comp)
+ {
+ const _Distance __len = (__last - __first + 1) / 2;
+ const _RandomAccessIterator __middle = __first + __len;
+ if (__len > __buffer_size)
+ {
+ std::__stable_sort_adaptive(__first, __middle, __buffer,
+ __buffer_size, __comp);
+ std::__stable_sort_adaptive(__middle, __last, __buffer,
+ __buffer_size, __comp);
+ }
+ else
+ {
+ std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
+ std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
+ }
+ std::__merge_adaptive(__first, __middle, __last,
+ _Distance(__middle - __first),
+ _Distance(__last - __middle),
+ __buffer, __buffer_size,
+ __comp);
+ }
+ template<typename _RandomAccessIterator>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle);
+ std::__inplace_stable_sort(__middle, __last);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ void
+ __inplace_stable_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ if (__last - __first < 15)
+ {
+ std::__insertion_sort(__first, __last, __comp);
+ return;
+ }
+ _RandomAccessIterator __middle = __first + (__last - __first) / 2;
+ std::__inplace_stable_sort(__first, __middle, __comp);
+ std::__inplace_stable_sort(__middle, __last, __comp);
+ std::__merge_without_buffer(__first, __middle, __last,
+ __middle - __first,
+ __last - __middle,
+ __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first2 < *__first1)
+ return false;
+ else if(*__first1 < *__first2)
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _Compare>
+ bool
+ includes(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1))
+ return false;
+ else if(__comp(*__first1, *__first2))
+ ++__first1;
+ else
+ ++__first1, ++__first2;
+ return __first2 == __last2;
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__i < *__ii)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*__i < *--__j))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ next_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__i, *__ii))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*__i, *--__j)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (*__ii < *__i)
+ {
+ _BidirectionalIterator __j = __last;
+ while (!(*--__j < *__i))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _BidirectionalIterator, typename _Compare>
+ bool
+ prev_permutation(_BidirectionalIterator __first,
+ _BidirectionalIterator __last, _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return false;
+ _BidirectionalIterator __i = __first;
+ ++__i;
+ if (__i == __last)
+ return false;
+ __i = __last;
+ --__i;
+ for(;;)
+ {
+ _BidirectionalIterator __ii = __i;
+ --__i;
+ if (__comp(*__ii, *__i))
+ {
+ _BidirectionalIterator __j = __last;
+ while (!bool(__comp(*--__j, *__i)))
+ {}
+ std::iter_swap(__i, __j);
+ std::reverse(__ii, __last);
+ return true;
+ }
+ if (__i == __first)
+ {
+ std::reverse(__first, __last);
+ return false;
+ }
+ }
+ }
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ replace_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (*__first == __old_value)
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _Predicate, typename _Tp>
+ _OutputIterator
+ replace_copy_if(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (__pred(*__first))
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+}
+namespace std {
+ template<typename _InputIterator, typename _Function>
+ _Function
+ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
+ {
+
+ ;
+ for (; __first != __last; ++__first)
+ __f(*__first);
+ return (__f);
+ }
+ template<typename _InputIterator, typename _Tp>
+ inline _InputIterator
+ find(_InputIterator __first, _InputIterator __last,
+ const _Tp& __val)
+ {
+
+
+ ;
+ return std::__find(__first, __last, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Predicate>
+ inline _InputIterator
+ find_if(_InputIterator __first, _InputIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__find_if(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _ForwardIterator>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (*__first1 == *__iter)
+ return __first1;
+ return __last1;
+ }
+ template<typename _InputIterator, typename _ForwardIterator,
+ typename _BinaryPredicate>
+ _InputIterator
+ find_first_of(_InputIterator __first1, _InputIterator __last1,
+ _ForwardIterator __first2, _ForwardIterator __last2,
+ _BinaryPredicate __comp)
+ {
+
+
+
+ ;
+ ;
+ for (; __first1 != __last1; ++__first1)
+ for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
+ if (__comp(*__first1, *__iter))
+ return __first1;
+ return __last1;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (*__first == *__next)
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _ForwardIterator, typename _BinaryPredicate>
+ _ForwardIterator
+ adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __last;
+ _ForwardIterator __next = __first;
+ while(++__next != __last)
+ {
+ if (__binary_pred(*__first, *__next))
+ return __first;
+ __first = __next;
+ }
+ return __last;
+ }
+ template<typename _InputIterator, typename _Tp>
+ typename iterator_traits<_InputIterator>::difference_type
+ count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (*__first == __value)
+ ++__n;
+ return __n;
+ }
+ template<typename _InputIterator, typename _Predicate>
+ typename iterator_traits<_InputIterator>::difference_type
+ count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
+ {
+
+
+ ;
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ ++__n;
+ return __n;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ return std::find(__first1, __last1, *__first2);
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ __first1 = std::find(__first1, __last1, *__first2);
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (*__current == *__p)
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2,
+ typename _BinaryPredicate>
+ _ForwardIterator1
+ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __predicate)
+ {
+
+
+
+ ;
+ ;
+ if (__first1 == __last1 || __first2 == __last2)
+ return __first1;
+ _ForwardIterator2 __p1(__first2);
+ if (++__p1 == __last2)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ return __first1;
+ }
+ _ForwardIterator2 __p;
+ _ForwardIterator1 __current = __first1;
+ for (;;)
+ {
+ while (__first1 != __last1
+ && !bool(__predicate(*__first1, *__first2)))
+ ++__first1;
+ if (__first1 == __last1)
+ return __last1;
+ __p = __p1;
+ __current = __first1;
+ if (++__current == __last1)
+ return __last1;
+ while (__predicate(*__current, *__p))
+ {
+ if (++__p == __last2)
+ return __first1;
+ if (++__current == __last1)
+ return __last1;
+ }
+ ++__first1;
+ }
+ return __first1;
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ return std::find(__first, __last, __val);
+ return std::__search_n(__first, __last, __count, __val,
+ std::__iterator_category(__first));
+ }
+ template<typename _ForwardIterator, typename _Integer, typename _Tp,
+ typename _BinaryPredicate>
+ _ForwardIterator
+ search_n(_ForwardIterator __first, _ForwardIterator __last,
+ _Integer __count, const _Tp& __val,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__count <= 0)
+ return __first;
+ if (__count == 1)
+ {
+ while (__first != __last && !bool(__binary_pred(*__first, __val)))
+ ++__first;
+ return __first;
+ }
+ return std::__search_n(__first, __last, __count, __val, __binary_pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _UnaryOperation>
+ _OutputIterator
+ transform(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result, _UnaryOperation __unary_op)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ *__result = __unary_op(*__first);
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _BinaryOperation>
+ _OutputIterator
+ transform(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _OutputIterator __result,
+ _BinaryOperation __binary_op)
+ {
+
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
+ *__result = __binary_op(*__first1, *__first2);
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ void
+ replace(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (*__first == __old_value)
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Predicate, typename _Tp>
+ void
+ replace_if(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, const _Tp& __new_value)
+ {
+
+
+
+ ;
+ for (; __first != __last; ++__first)
+ if (__pred(*__first))
+ *__first = __new_value;
+ }
+ template<typename _ForwardIterator, typename _Generator>
+ void
+ generate(_ForwardIterator __first, _ForwardIterator __last,
+ _Generator __gen)
+ {
+
+
+ ;
+ for (; __first != __last; ++__first)
+ *__first = __gen();
+ }
+ template<typename _OutputIterator, typename _Size, typename _Generator>
+ _OutputIterator
+ generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
+ {
+
+ for (; __n > 0; --__n, ++__first)
+ *__first = __gen();
+ return __first;
+ }
+ template<typename _InputIterator, typename _OutputIterator>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ {
+
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _InputIterator, typename _OutputIterator,
+ typename _BinaryPredicate>
+ inline _OutputIterator
+ unique_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __result;
+ return std::__unique_copy(__first, __last, __result, __binary_pred,
+ std::__iterator_category(__first),
+ std::__iterator_category(__result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+
+ ;
+ if (__first != __last)
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
+ }
+ template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
+ void
+ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _RandomNumberGenerator& __rand)
+ {
+
+ ;
+ if (__first == __last)
+ return;
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ std::iter_swap(__i, __first + __rand((__i - __first) + 1));
+ }
+ template<typename _ForwardIterator, typename _Predicate>
+ inline _ForwardIterator
+ partition(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred)
+ {
+
+
+ ;
+ return std::__partition(__first, __last, __pred,
+ std::__iterator_category(__first));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last);
+ std::sort_heap(__first, __middle);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ partial_sort(_RandomAccessIterator __first,
+ _RandomAccessIterator __middle,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ std::__heap_select(__first, __middle, __last, __comp);
+ std::sort_heap(__first, __middle, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2);
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ ;
+ if (__first == __last || __nth == __last)
+ return;
+ std::__introselect(__first, __nth, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2);
+ std::__final_insertion_sort(__first, __last);
+ }
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+
+ ;
+ if (__first != __last)
+ {
+ std::__introsort_loop(__first, __last,
+ std::__lg(__last - __first) * 2, __comp);
+ std::__final_insertion_sort(__first, __last, __comp);
+ }
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ merge(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _RandomAccessIterator>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()));
+ }
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ typedef typename iterator_traits<_RandomAccessIterator>::difference_type
+ _DistanceType;
+
+
+ ;
+ _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
+ __last);
+ if (__buf.begin() == 0)
+ std::__inplace_stable_sort(__first, __last, __comp);
+ else
+ std::__stable_sort_adaptive(__first, __last, __buf.begin(),
+ _DistanceType(__buf.size()), __comp);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_union(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ {
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ }
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ }
+ ++__result;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1, __last1,
+ __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ ++__first1;
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ ++__first1;
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__first2;
+ ++__result;
+ }
+ return __result;
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result, _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ ++__first2;
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first1, __last1, __result);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first1 < *__first2)
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (*__first2 < *__first1)
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2, std::copy(__first1,
+ __last1, __result));
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _OutputIterator, typename _Compare>
+ _OutputIterator
+ set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _OutputIterator __result,
+ _Compare __comp)
+ {
+ typedef typename iterator_traits<_InputIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_InputIterator2>::value_type
+ _ValueType2;
+
+
+
+
+
+
+ ;
+ ;
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first1, *__first2))
+ {
+ *__result = *__first1;
+ ++__first1;
+ ++__result;
+ }
+ else if (__comp(*__first2, *__first1))
+ {
+ *__result = *__first2;
+ ++__first2;
+ ++__result;
+ }
+ else
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return std::copy(__first2, __last2,
+ std::copy(__first1, __last1, __result));
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__first < *__result)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ min_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__first, *__result))
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last)
+ {
+
+
+ ;
+ if (__first == __last)
+ return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (*__result < *__first)
+ __result = __first;
+ return __result;
+ }
+ template<typename _ForwardIterator, typename _Compare>
+ _ForwardIterator
+ max_element(_ForwardIterator __first, _ForwardIterator __last,
+ _Compare __comp)
+ {
+
+
+ ;
+ if (__first == __last) return __first;
+ _ForwardIterator __result = __first;
+ while (++__first != __last)
+ if (__comp(*__result, *__first))
+ __result = __first;
+ return __result;
+ }
+}
+
+
+
+
+
+namespace std {
+ template<typename _Alloc>
+ class allocator;
+ template<class _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_string;
+ template<> struct char_traits<char>;
+ typedef basic_string<char> string;
+ template<> struct char_traits<wchar_t>;
+ typedef basic_string<wchar_t> wstring;
+}
+
+
+
+typedef __builtin_va_list __gnuc_va_list;
+extern "C" {
+struct tm;
+typedef _mbstate_t mbstate_t;
+wint_t __attribute__((__cdecl__)) btowc (int);
+int __attribute__((__cdecl__)) wctob (wint_t);
+size_t __attribute__((__cdecl__)) mbrlen (const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbrtowc (wchar_t * , const char * , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbrtowc_r (struct _reent *, wchar_t * , const char * , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) mbsinit (const mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsnrtowcs (wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsnrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) mbsrtowcs (wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _mbsrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcrtomb (char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcrtomb_r (struct _reent *, char * , wchar_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsnrtombs (char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsnrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) wcsrtombs (char * , const wchar_t ** , size_t, mbstate_t *);
+size_t __attribute__((__cdecl__)) _wcsrtombs_r (struct _reent *, char * , const wchar_t ** , size_t, mbstate_t *);
+int __attribute__((__cdecl__)) wcscasecmp (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscat (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcschr (const wchar_t *, wchar_t);
+int __attribute__((__cdecl__)) wcscmp (const wchar_t *, const wchar_t *);
+int __attribute__((__cdecl__)) wcscoll (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcscpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcpcpy (wchar_t * , const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsdup (const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) _wcsdup_r (struct _reent *, const wchar_t * );
+size_t __attribute__((__cdecl__)) wcscspn (const wchar_t *, const wchar_t *);
+size_t __attribute__((__cdecl__)) wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *);
+size_t __attribute__((__cdecl__)) wcslcat (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslcpy (wchar_t *, const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcslen (const wchar_t *);
+int __attribute__((__cdecl__)) wcsncasecmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncat (wchar_t * , const wchar_t * , size_t);
+int __attribute__((__cdecl__)) wcsncmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcsncpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wcpncpy (wchar_t * , const wchar_t * , size_t);
+size_t __attribute__((__cdecl__)) wcsnlen (const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wcspbrk (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsrchr (const wchar_t *, wchar_t);
+size_t __attribute__((__cdecl__)) wcsspn (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcsstr (const wchar_t *, const wchar_t *);
+wchar_t *__attribute__((__cdecl__)) wcstok (wchar_t *, const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) wcstod (const wchar_t *, wchar_t **);
+double __attribute__((__cdecl__)) _wcstod_r (struct _reent *, const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) wcstof (const wchar_t *, wchar_t **);
+float __attribute__((__cdecl__)) _wcstof_r (struct _reent *, const wchar_t *, wchar_t **);
+int __attribute__((__cdecl__)) wcswidth (const wchar_t *, size_t);
+size_t __attribute__((__cdecl__)) wcsxfrm (wchar_t *, const wchar_t *, size_t);
+int __attribute__((__cdecl__)) wcwidth (const wchar_t);
+wchar_t *__attribute__((__cdecl__)) wmemchr (const wchar_t *, wchar_t, size_t);
+int __attribute__((__cdecl__)) wmemcmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemcpy (wchar_t * , const wchar_t * , size_t);
+wchar_t *__attribute__((__cdecl__)) wmemmove (wchar_t *, const wchar_t *, size_t);
+wchar_t *__attribute__((__cdecl__)) wmemset (wchar_t *, wchar_t, size_t);
+long __attribute__((__cdecl__)) wcstol (const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) wcstoll (const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) wcstoul (const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) wcstoull (const wchar_t *, wchar_t **, int);
+long __attribute__((__cdecl__)) _wcstol_r (struct _reent *, const wchar_t *, wchar_t **, int);
+long long __attribute__((__cdecl__)) _wcstoll_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long __attribute__((__cdecl__)) _wcstoul_r (struct _reent *, const wchar_t *, wchar_t **, int);
+unsigned long long __attribute__((__cdecl__)) _wcstoull_r (struct _reent *, const wchar_t *, wchar_t **, int);
+wint_t __attribute__((__cdecl__)) fgetwc (__FILE *);
+wchar_t *__attribute__((__cdecl__)) fgetws (wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) fputwc (wchar_t, __FILE *);
+int __attribute__((__cdecl__)) fputws (const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) fwide (__FILE *, int);
+wint_t __attribute__((__cdecl__)) getwc (__FILE *);
+wint_t __attribute__((__cdecl__)) getwchar (void);
+wint_t __attribute__((__cdecl__)) putwc (wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) putwchar (wchar_t);
+wint_t __attribute__((__cdecl__)) ungetwc (wint_t wc, __FILE *);
+wint_t __attribute__((__cdecl__)) _fgetwc_r (struct _reent *, __FILE *);
+wchar_t *__attribute__((__cdecl__)) _fgetws_r (struct _reent *, wchar_t *, int, __FILE *);
+wint_t __attribute__((__cdecl__)) _fputwc_r (struct _reent *, wchar_t, __FILE *);
+int __attribute__((__cdecl__)) _fputws_r (struct _reent *, const wchar_t *, __FILE *);
+int __attribute__((__cdecl__)) _fwide_r (struct _reent *, __FILE *, int);
+wint_t __attribute__((__cdecl__)) _getwc_r (struct _reent *, __FILE *);
+wint_t __attribute__((__cdecl__)) _getwchar_r (struct _reent *ptr);
+wint_t __attribute__((__cdecl__)) _putwc_r (struct _reent *, wchar_t, __FILE *);
+wint_t __attribute__((__cdecl__)) _putwchar_r (struct _reent *, wchar_t);
+wint_t __attribute__((__cdecl__)) _ungetwc_r (struct _reent *, wint_t wc, __FILE *);
+__FILE *__attribute__((__cdecl__)) open_wmemstream (wchar_t **, size_t *);
+__FILE *__attribute__((__cdecl__)) _open_wmemstream_r (struct _reent *, wchar_t **, size_t *);
+int __attribute__((__cdecl__)) fwprintf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swprintf (wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwprintf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswprintf (wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwprintf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wprintf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwprintf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwprintf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwprintf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wprintf_r (struct _reent *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) fwscanf (__FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) swscanf (const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) vfwscanf (__FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vswscanf (const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) vwscanf (const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) wscanf (const wchar_t *, ...);
+int __attribute__((__cdecl__)) _fwscanf_r (struct _reent *, __FILE *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _swscanf_r (struct _reent *, const wchar_t *, const wchar_t *, ...);
+int __attribute__((__cdecl__)) _vfwscanf_r (struct _reent *, __FILE *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vswscanf_r (struct _reent *, const wchar_t *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _vwscanf_r (struct _reent *, const wchar_t *, __gnuc_va_list);
+int __attribute__((__cdecl__)) _wscanf_r (struct _reent *, const wchar_t *, ...);
+}
+namespace std {
+ using ::mbstate_t;
+}
+namespace std {
+ using ::wint_t;
+ using ::btowc;
+ using ::fgetwc;
+ using ::fgetws;
+ using ::fputwc;
+ using ::fputws;
+ using ::fwide;
+ using ::fwprintf;
+ using ::fwscanf;
+ using ::getwc;
+ using ::getwchar;
+ using ::mbrlen;
+ using ::mbrtowc;
+ using ::mbsinit;
+ using ::mbsrtowcs;
+ using ::putwc;
+ using ::putwchar;
+ using ::swprintf;
+ using ::swscanf;
+ using ::ungetwc;
+ using ::vfwprintf;
+ using ::vfwscanf;
+ using ::vswprintf;
+ using ::vswscanf;
+ using ::vwprintf;
+ using ::vwscanf;
+ using ::wcrtomb;
+ using ::wcscat;
+ using ::wcscmp;
+ using ::wcscoll;
+ using ::wcscpy;
+ using ::wcscspn;
+ using ::wcsftime;
+ using ::wcslen;
+ using ::wcsncat;
+ using ::wcsncmp;
+ using ::wcsncpy;
+ using ::wcsrtombs;
+ using ::wcsspn;
+ using ::wcstod;
+ using ::wcstof;
+ using ::wcstok;
+ using ::wcstol;
+ using ::wcstoul;
+ using ::wcsxfrm;
+ using ::wctob;
+ using ::wmemcmp;
+ using ::wmemcpy;
+ using ::wmemmove;
+ using ::wmemset;
+ using ::wprintf;
+ using ::wscanf;
+ using ::wcschr;
+ using ::wcspbrk;
+ using ::wcsrchr;
+ using ::wcsstr;
+ using ::wmemchr;
+ inline wchar_t*
+ wcschr(wchar_t* __p, wchar_t __c)
+ { return wcschr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcspbrk(wchar_t* __s1, const wchar_t* __s2)
+ { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wcsrchr(wchar_t* __p, wchar_t __c)
+ { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }
+ inline wchar_t*
+ wcsstr(wchar_t* __s1, const wchar_t* __s2)
+ { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }
+ inline wchar_t*
+ wmemchr(wchar_t* __p, wchar_t __c, size_t __n)
+ { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }
+}
+namespace std {
+ typedef long long streamoff;
+ typedef ptrdiff_t streamsize;
+ template<typename _StateT>
+ class fpos
+ {
+ private:
+ streamoff _M_off;
+ _StateT _M_state;
+ public:
+ fpos()
+ : _M_off(0), _M_state() { }
+ fpos(streamoff __off)
+ : _M_off(__off), _M_state() { }
+ operator streamoff() const { return _M_off; }
+ void
+ state(_StateT __st)
+ { _M_state = __st; }
+ _StateT
+ state() const
+ { return _M_state; }
+ fpos&
+ operator+=(streamoff __off)
+ {
+ _M_off += __off;
+ return *this;
+ }
+ fpos&
+ operator-=(streamoff __off)
+ {
+ _M_off -= __off;
+ return *this;
+ }
+ fpos
+ operator+(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos += __off;
+ return __pos;
+ }
+ fpos
+ operator-(streamoff __off) const
+ {
+ fpos __pos(*this);
+ __pos -= __off;
+ return __pos;
+ }
+ streamoff
+ operator-(const fpos& __other) const
+ { return _M_off - __other._M_off; }
+ };
+ template<typename _StateT>
+ inline bool
+ operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) == streamoff(__rhs); }
+ template<typename _StateT>
+ inline bool
+ operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
+ { return streamoff(__lhs) != streamoff(__rhs); }
+ typedef fpos<mbstate_t> streampos;
+ typedef fpos<mbstate_t> wstreampos;
+}
+namespace std {
+ class ios_base;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ios;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_streambuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_istream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_iostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringbuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_istringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_ostringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_stringstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_filebuf;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ifstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ofstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_fstream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class ostreambuf_iterator;
+ typedef basic_ios<char> ios;
+ typedef basic_streambuf<char> streambuf;
+ typedef basic_istream<char> istream;
+ typedef basic_ostream<char> ostream;
+ typedef basic_iostream<char> iostream;
+ typedef basic_stringbuf<char> stringbuf;
+ typedef basic_istringstream<char> istringstream;
+ typedef basic_ostringstream<char> ostringstream;
+ typedef basic_stringstream<char> stringstream;
+ typedef basic_filebuf<char> filebuf;
+ typedef basic_ifstream<char> ifstream;
+ typedef basic_ofstream<char> ofstream;
+ typedef basic_fstream<char> fstream;
+ typedef basic_ios<wchar_t> wios;
+ typedef basic_streambuf<wchar_t> wstreambuf;
+ typedef basic_istream<wchar_t> wistream;
+ typedef basic_ostream<wchar_t> wostream;
+ typedef basic_iostream<wchar_t> wiostream;
+ typedef basic_stringbuf<wchar_t> wstringbuf;
+ typedef basic_istringstream<wchar_t> wistringstream;
+ typedef basic_ostringstream<wchar_t> wostringstream;
+ typedef basic_stringstream<wchar_t> wstringstream;
+ typedef basic_filebuf<wchar_t> wfilebuf;
+ typedef basic_ifstream<wchar_t> wifstream;
+ typedef basic_ofstream<wchar_t> wofstream;
+ typedef basic_fstream<wchar_t> wfstream;
+}
+
+
+
+namespace __gnu_cxx {
+ template<typename _CharT>
+ struct _Char_types
+ {
+ typedef unsigned long int_type;
+ typedef std::streampos pos_type;
+ typedef std::streamoff off_type;
+ typedef std::mbstate_t state_type;
+ };
+ template<typename _CharT>
+ struct char_traits
+ {
+ typedef _CharT char_type;
+ typedef typename _Char_types<_CharT>::int_type int_type;
+ typedef typename _Char_types<_CharT>::pos_type pos_type;
+ typedef typename _Char_types<_CharT>::off_type off_type;
+ typedef typename _Char_types<_CharT>::state_type state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
+ static std::size_t
+ length(const char_type* __s);
+ static const char_type*
+ find(const char_type* __s, std::size_t __n, const char_type& __a);
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n);
+ static char_type*
+ assign(char_type* __s, std::size_t __n, char_type __a);
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
+ };
+ template<typename _CharT>
+ int
+ char_traits<_CharT>::
+ compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (lt(__s1[__i], __s2[__i]))
+ return -1;
+ else if (lt(__s2[__i], __s1[__i]))
+ return 1;
+ return 0;
+ }
+ template<typename _CharT>
+ std::size_t
+ char_traits<_CharT>::
+ length(const char_type* __p)
+ {
+ std::size_t __i = 0;
+ while (!eq(__p[__i], char_type()))
+ ++__i;
+ return __i;
+ }
+ template<typename _CharT>
+ const typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ find(const char_type* __s, std::size_t __n, const char_type& __a)
+ {
+ for (std::size_t __i = 0; __i < __n; ++__i)
+ if (eq(__s[__i], __a))
+ return __s + __i;
+ return 0;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ move(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ return static_cast<_CharT*>(__builtin_memmove(__s1, __s2,
+ __n * sizeof(char_type)));
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ copy(char_type* __s1, const char_type* __s2, std::size_t __n)
+ {
+ std::copy(__s2, __s2 + __n, __s1);
+ return __s1;
+ }
+ template<typename _CharT>
+ typename char_traits<_CharT>::char_type*
+ char_traits<_CharT>::
+ assign(char_type* __s, std::size_t __n, char_type __a)
+ {
+ std::fill_n(__s, __n, __a);
+ return __s;
+ }
+}
+namespace std {
+ template<class _CharT>
+ struct char_traits : public __gnu_cxx::char_traits<_CharT>
+ { };
+ template<>
+ struct char_traits<char>
+ {
+ typedef char char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return __builtin_memcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return __builtin_strlen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n)); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memmove(__s1, __s2, __n)); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(__builtin_memcpy(__s1, __s2, __n)); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return static_cast<char_type*>(__builtin_memset(__s, __a, __n)); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>((-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return (__c == eof()) ? 0 : __c; }
+ };
+ template<>
+ struct char_traits<wchar_t>
+ {
+ typedef wchar_t char_type;
+ typedef wint_t int_type;
+ typedef streamoff off_type;
+ typedef wstreampos pos_type;
+ typedef mbstate_t state_type;
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcmp(__s1, __s2, __n); }
+ static size_t
+ length(const char_type* __s)
+ { return wcslen(__s); }
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return wmemchr(__s, __a, __n); }
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemmove(__s1, __s2, __n); }
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcpy(__s1, __s2, __n); }
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return wmemset(__s, __a, __n); }
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(__c); }
+ static int_type
+ to_int_type(const char_type& __c)
+ { return int_type(__c); }
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+ static int_type
+ eof()
+ { return static_cast<int_type>(((wint_t)-1)); }
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? 0 : __c; }
+ };
+}
+
+
+
+extern "C" {
+struct lconv
+{
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_n_cs_precedes;
+ char int_n_sep_by_space;
+ char int_n_sign_posn;
+ char int_p_cs_precedes;
+ char int_p_sep_by_space;
+ char int_p_sign_posn;
+};
+char *__attribute__((__cdecl__)) setlocale (int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) localeconv (void);
+struct _reent;
+char *__attribute__((__cdecl__)) _setlocale_r (struct _reent *, int category, const char *locale);
+struct lconv *__attribute__((__cdecl__)) _localeconv_r (struct _reent *);
+}
+namespace std {
+ using ::lconv;
+ using ::setlocale;
+ using ::localeconv;
+}
+
+namespace std {
+ typedef int* __c_locale;
+ inline int
+ __convert_from_v(const __c_locale&, char* __out,
+ const int __size __attribute__((__unused__)),
+ const char* __fmt, ...)
+ {
+ char* __old = std::setlocale(4, __null);
+ char* __sav = __null;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ std::setlocale(4, "C");
+ }
+ __builtin_va_list __args;
+ __builtin_va_start(__args, __fmt);
+ const int __ret = __builtin_vsprintf(__out, __fmt, __args);
+ __builtin_va_end(__args);
+ if (__sav)
+ {
+ std::setlocale(4, __sav);
+ delete [] __sav;
+ }
+ return __ret;
+ }
+}
+
+extern "C" {
+int __attribute__((__cdecl__)) isalnum (int __c);
+int __attribute__((__cdecl__)) isalpha (int __c);
+int __attribute__((__cdecl__)) iscntrl (int __c);
+int __attribute__((__cdecl__)) isdigit (int __c);
+int __attribute__((__cdecl__)) isgraph (int __c);
+int __attribute__((__cdecl__)) islower (int __c);
+int __attribute__((__cdecl__)) isprint (int __c);
+int __attribute__((__cdecl__)) ispunct (int __c);
+int __attribute__((__cdecl__)) isspace (int __c);
+int __attribute__((__cdecl__)) isupper (int __c);
+int __attribute__((__cdecl__)) isxdigit (int __c);
+int __attribute__((__cdecl__)) tolower (int __c);
+int __attribute__((__cdecl__)) toupper (int __c);
+int __attribute__((__cdecl__)) isblank (int __c);
+int __attribute__((__cdecl__)) isascii (int __c);
+int __attribute__((__cdecl__)) toascii (int __c);
+extern __attribute__((dllimport)) char *__ctype_ptr__;
+extern __attribute__((dllimport)) const char _ctype_[];
+}
+namespace std {
+ using ::isalnum;
+ using ::isalpha;
+ using ::iscntrl;
+ using ::isdigit;
+ using ::isgraph;
+ using ::islower;
+ using ::isprint;
+ using ::ispunct;
+ using ::isspace;
+ using ::isupper;
+ using ::isxdigit;
+ using ::tolower;
+ using ::toupper;
+}
+namespace std {
+ class locale;
+ template<typename _Facet>
+ bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale&);
+ template<typename _CharT>
+ bool
+ isspace(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isprint(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ iscntrl(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isupper(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ islower(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalpha(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ ispunct(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isxdigit(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isalnum(_CharT, const locale&);
+ template<typename _CharT>
+ bool
+ isgraph(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ toupper(_CharT, const locale&);
+ template<typename _CharT>
+ _CharT
+ tolower(_CharT, const locale&);
+ class ctype_base;
+ template<typename _CharT>
+ class ctype;
+ template<> class ctype<char>;
+ template<> class ctype<wchar_t>;
+ template<typename _CharT>
+ class ctype_byname;
+ class codecvt_base;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt;
+ template<> class codecvt<char, char, mbstate_t>;
+ template<> class codecvt<wchar_t, char, mbstate_t>;
+ template<typename _InternT, typename _ExternT, typename _StateT>
+ class codecvt_byname;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class num_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class num_put;
+
+ template<typename _CharT> class numpunct;
+ template<typename _CharT> class numpunct_byname;
+ template<typename _CharT>
+ class collate;
+ template<typename _CharT> class
+ collate_byname;
+ class time_base;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class time_get_byname;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class time_put_byname;
+ class money_base;
+
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class money_get;
+ template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
+ class money_put;
+
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct;
+ template<typename _CharT, bool _Intl = false>
+ class moneypunct_byname;
+ class messages_base;
+ template<typename _CharT>
+ class messages;
+ template<typename _CharT>
+ class messages_byname;
+}
+
+#pragma GCC visibility push(default)
+extern "C" {
+typedef unsigned long sigset_t;
+extern "C" {
+struct _fpstate
+{
+ unsigned long cw;
+ unsigned long sw;
+ unsigned long tag;
+ unsigned long ipoff;
+ unsigned long cssel;
+ unsigned long dataoff;
+ unsigned long datasel;
+ unsigned char _st[80];
+ unsigned long nxst;
+};
+struct ucontext
+{
+ unsigned long cr2;
+ unsigned long dr0;
+ unsigned long dr1;
+ unsigned long dr2;
+ unsigned long dr3;
+ unsigned long dr6;
+ unsigned long dr7;
+ struct _fpstate fpstate;
+ unsigned long gs;
+ unsigned long fs;
+ unsigned long es;
+ unsigned long ds;
+ unsigned long edi;
+ unsigned long esi;
+ unsigned long ebx;
+ unsigned long edx;
+ unsigned long ecx;
+ unsigned long eax;
+ unsigned long ebp;
+ unsigned long eip;
+ unsigned long cs;
+ unsigned long eflags;
+ unsigned long esp;
+ unsigned long ss;
+ unsigned char _internal;
+ unsigned long oldmask;
+};
+typedef union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+} sigval_t;
+typedef struct sigevent
+{
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+ void (*sigev_notify_function) (sigval_t);
+ pthread_attr_t *sigev_notify_attributes;
+} sigevent_t;
+#pragma pack(push,4)
+struct _sigcommune
+{
+ __uint32_t _si_code;
+ void *_si_read_handle;
+ void *_si_write_handle;
+ void *_si_process_handle;
+ __extension__ union
+ {
+ int _si_fd;
+ void *_si_pipe_fhandler;
+ char *_si_str;
+ };
+};
+typedef struct
+{
+ int si_signo;
+ int si_code;
+ pid_t si_pid;
+ uid_t si_uid;
+ int si_errno;
+ __extension__ union
+ {
+ __uint32_t __pad[32];
+ struct _sigcommune _si_commune;
+ __extension__ union
+ {
+ struct
+ {
+ union
+ {
+ struct
+ {
+ timer_t si_tid;
+ unsigned int si_overrun;
+ };
+ sigval_t si_sigval;
+ sigval_t si_value;
+ };
+ };
+ };
+ __extension__ struct
+ {
+ int si_status;
+ clock_t si_utime;
+ clock_t si_stime;
+ };
+ void *si_addr;
+ };
+} siginfo_t;
+#pragma pack(pop)
+enum
+{
+ SI_USER = 0,
+ SI_ASYNCIO = 2,
+ SI_MESGQ,
+ SI_TIMER,
+ SI_QUEUE,
+ SI_KERNEL,
+ ILL_ILLOPC,
+ ILL_ILLOPN,
+ ILL_ILLADR,
+ ILL_ILLTRP,
+ ILL_PRVOPC,
+ ILL_PRVREG,
+ ILL_COPROC,
+ ILL_BADSTK,
+ FPE_INTDIV,
+ FPE_INTOVF,
+ FPE_FLTDIV,
+ FPE_FLTOVF,
+ FPE_FLTUND,
+ FPE_FLTRES,
+ FPE_FLTINV,
+ FPE_FLTSUB,
+ SEGV_MAPERR,
+ SEGV_ACCERR,
+ BUS_ADRALN,
+ BUS_ADRERR,
+ BUS_OBJERR,
+ CLD_EXITED,
+ CLD_KILLED,
+ CLD_DUMPED,
+ CLD_TRAPPED,
+ CLD_STOPPED,
+ CLD_CONTINUED
+};
+enum
+{
+ SIGEV_SIGNAL = 0,
+ SIGEV_NONE,
+ SIGEV_THREAD
+};
+typedef void (*_sig_func_ptr)(int);
+struct sigaction
+{
+ __extension__ union
+ {
+ _sig_func_ptr sa_handler;
+ void (*sa_sigaction) ( int, siginfo_t *, void * );
+ };
+ sigset_t sa_mask;
+ int sa_flags;
+};
+int sigwait (const sigset_t *, int *);
+int sigwaitinfo (const sigset_t *, siginfo_t *);
+int sighold (int);
+int sigignore (int);
+int sigrelse (int);
+_sig_func_ptr sigset (int, _sig_func_ptr);
+int sigqueue(pid_t, int, const union sigval);
+int siginterrupt (int, int);
+extern const char __attribute__((dllimport)) *sys_sigabbrev[];
+}
+int __attribute__((__cdecl__)) sigprocmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) pthread_sigmask (int how, const sigset_t *set, sigset_t *oset);
+int __attribute__((__cdecl__)) kill (pid_t, int);
+int __attribute__((__cdecl__)) killpg (pid_t, int);
+int __attribute__((__cdecl__)) sigaction (int, const struct sigaction *, struct sigaction *);
+int __attribute__((__cdecl__)) sigaddset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigdelset (sigset_t *, const int);
+int __attribute__((__cdecl__)) sigismember (const sigset_t *, int);
+int __attribute__((__cdecl__)) sigfillset (sigset_t *);
+int __attribute__((__cdecl__)) sigemptyset (sigset_t *);
+int __attribute__((__cdecl__)) sigpending (sigset_t *);
+int __attribute__((__cdecl__)) sigsuspend (const sigset_t *);
+int __attribute__((__cdecl__)) sigpause (int);
+int __attribute__((__cdecl__)) pthread_kill (pthread_t thread, int sig);
+int __attribute__((__cdecl__)) sigwaitinfo (const sigset_t *set, siginfo_t *info);
+int __attribute__((__cdecl__)) sigtimedwait (const sigset_t *set, siginfo_t *info, const struct timespec *timeout);
+int __attribute__((__cdecl__)) sigwait (const sigset_t *set, int *sig);
+int __attribute__((__cdecl__)) sigqueue (pid_t pid, int signo, const union sigval value);
+}
+extern "C" {
+typedef int sig_atomic_t;
+typedef _sig_func_ptr sig_t;
+typedef _sig_func_ptr sighandler_t;
+struct _reent;
+_sig_func_ptr __attribute__((__cdecl__)) _signal_r (struct _reent *, int, _sig_func_ptr);
+int __attribute__((__cdecl__)) _raise_r (struct _reent *, int);
+_sig_func_ptr __attribute__((__cdecl__)) signal (int, _sig_func_ptr);
+int __attribute__((__cdecl__)) raise (int);
+}
+extern "C" {
+struct sched_param {
+ int sched_priority;
+};
+}
+extern "C" {
+int sched_setparam(
+ pid_t __pid,
+ const struct sched_param *__param
+);
+int sched_getparam(
+ pid_t __pid,
+ struct sched_param *__param
+);
+int sched_setscheduler(
+ pid_t __pid,
+ int __policy,
+ const struct sched_param *__param
+);
+int sched_getscheduler(
+ pid_t __pid
+);
+int sched_get_priority_max(
+ int __policy
+);
+int sched_get_priority_min(
+ int __policy
+);
+int sched_rr_get_interval(
+ pid_t __pid,
+ struct timespec *__interval
+);
+int sched_yield( void );
+}
+extern "C"
+{
+int pthread_attr_destroy (pthread_attr_t *);
+int pthread_attr_getdetachstate (const pthread_attr_t *, int *);
+int pthread_attr_getinheritsched (const pthread_attr_t *, int *);
+int pthread_attr_getschedparam (const pthread_attr_t *, struct sched_param *);
+int pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
+int pthread_attr_getscope (const pthread_attr_t *, int *);
+int pthread_attr_init (pthread_attr_t *);
+int pthread_attr_setdetachstate (pthread_attr_t *, int);
+int pthread_attr_setinheritsched (pthread_attr_t *, int);
+int pthread_attr_setschedparam (pthread_attr_t *, const struct sched_param *);
+int pthread_attr_setschedpolicy (pthread_attr_t *, int);
+int pthread_attr_setscope (pthread_attr_t *, int);
+int pthread_attr_getstacksize (const pthread_attr_t *, size_t *);
+int pthread_attr_setstacksize (pthread_attr_t *, size_t);
+int pthread_cancel (pthread_t);
+typedef void (*__cleanup_routine_type) (void *);
+typedef struct _pthread_cleanup_handler
+{
+ __cleanup_routine_type function;
+ void *arg;
+ struct _pthread_cleanup_handler *next;
+} __pthread_cleanup_handler;
+void _pthread_cleanup_push (__pthread_cleanup_handler *handler);
+void _pthread_cleanup_pop (int execute);
+int pthread_cond_broadcast (pthread_cond_t *);
+int pthread_cond_destroy (pthread_cond_t *);
+int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *);
+int pthread_cond_signal (pthread_cond_t *);
+int pthread_cond_timedwait (pthread_cond_t *,
+ pthread_mutex_t *, const struct timespec *);
+int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
+int pthread_condattr_destroy (pthread_condattr_t *);
+int pthread_condattr_getpshared (const pthread_condattr_t *, int *);
+int pthread_condattr_init (pthread_condattr_t *);
+int pthread_condattr_setpshared (pthread_condattr_t *, int);
+int pthread_create (pthread_t *, const pthread_attr_t *,
+ void *(*)(void *), void *);
+int pthread_detach (pthread_t);
+int pthread_equal (pthread_t, pthread_t);
+void pthread_exit (void *);
+int pthread_getschedparam (pthread_t, int *, struct sched_param *);
+void *pthread_getspecific (pthread_key_t);
+int pthread_join (pthread_t, void **);
+int pthread_key_create (pthread_key_t *, void (*)(void *));
+int pthread_key_delete (pthread_key_t);
+int pthread_mutex_destroy (pthread_mutex_t *);
+int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *);
+int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+int pthread_mutex_lock (pthread_mutex_t *);
+int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *);
+int pthread_mutex_trylock (pthread_mutex_t *);
+int pthread_mutex_unlock (pthread_mutex_t *);
+int pthread_mutexattr_destroy (pthread_mutexattr_t *);
+int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_getpshared (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_gettype (const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_init (pthread_mutexattr_t *);
+int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setprotocol (pthread_mutexattr_t *, int);
+int pthread_mutexattr_setpshared (pthread_mutexattr_t *, int);
+int pthread_mutexattr_settype (pthread_mutexattr_t *, int);
+int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);
+int pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
+int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);
+int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
+int pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr);
+int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr,
+ int *pshared);
+int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);
+int pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr);
+int pthread_once (pthread_once_t *, void (*)(void));
+int pthread_getconcurrency (void);
+int pthread_setconcurrency (int);
+pthread_t pthread_self (void);
+int pthread_setcancelstate (int, int *);
+int pthread_setcanceltype (int, int *);
+int pthread_setschedparam (pthread_t, int, const struct sched_param *);
+int pthread_setspecific (pthread_key_t, const void *);
+void pthread_testcancel (void);
+int pthread_suspend (pthread_t);
+int pthread_continue (pthread_t);
+int pthread_yield (void);
+}
+typedef pthread_t __gthread_t;
+typedef pthread_key_t __gthread_key_t;
+typedef pthread_once_t __gthread_once_t;
+typedef pthread_mutex_t __gthread_mutex_t;
+typedef pthread_mutex_t __gthread_recursive_mutex_t;
+typedef pthread_cond_t __gthread_cond_t;
+typedef struct timespec __gthread_time_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static inline int
+__gthread_active_p (void)
+{
+ return 1;
+}
+static inline int
+__gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
+ void *__args)
+{
+ return pthread_create (__threadid, __null, __func, __args);
+}
+static inline int
+__gthread_join (__gthread_t __threadid, void **__value_ptr)
+{
+ return pthread_join (__threadid, __value_ptr);
+}
+static inline int
+__gthread_detach (__gthread_t __threadid)
+{
+ return pthread_detach (__threadid);
+}
+static inline int
+__gthread_equal (__gthread_t __t1, __gthread_t __t2)
+{
+ return pthread_equal (__t1, __t2);
+}
+static inline __gthread_t
+__gthread_self (void)
+{
+ return pthread_self ();
+}
+static inline int
+__gthread_yield (void)
+{
+ return sched_yield ();
+}
+static inline int
+__gthread_once (__gthread_once_t *__once, void (*__func) (void))
+{
+ if (__gthread_active_p ())
+ return pthread_once (__once, __func);
+ else
+ return -1;
+}
+static inline int
+__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
+{
+ return pthread_key_create (__key, __dtor);
+}
+static inline int
+__gthread_key_delete (__gthread_key_t __key)
+{
+ return pthread_key_delete (__key);
+}
+static inline void *
+__gthread_getspecific (__gthread_key_t __key)
+{
+ return pthread_getspecific (__key);
+}
+static inline int
+__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
+{
+ return pthread_setspecific (__key, __ptr);
+}
+static inline int
+__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_destroy (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_lock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_lock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_trylock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
+{
+ if (__gthread_active_p ())
+ return pthread_mutex_unlock (__mutex);
+ else
+ return 0;
+}
+static inline int
+__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_lock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_trylock (__mutex);
+}
+static inline int
+__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_mutex_unlock (__mutex);
+}
+static inline int
+__gthread_cond_broadcast (__gthread_cond_t *__cond)
+{
+ return pthread_cond_broadcast (__cond);
+}
+static inline int
+__gthread_cond_signal (__gthread_cond_t *__cond)
+{
+ return pthread_cond_signal (__cond);
+}
+static inline int
+__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
+{
+ return pthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return pthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex)
+{
+ return __gthread_cond_wait (__cond, __mutex);
+}
+static inline int
+__gthread_cond_timedwait_recursive (__gthread_cond_t *__cond,
+ __gthread_recursive_mutex_t *__mutex,
+ const __gthread_time_t *__abs_timeout)
+{
+ return __gthread_cond_timedwait (__cond, __mutex, __abs_timeout);
+}
+static inline int
+__gthread_cond_destroy (__gthread_cond_t* __cond)
+{
+ return pthread_cond_destroy (__cond);
+}
+#pragma GCC visibility pop
+typedef int _Atomic_word;
+namespace __gnu_cxx {
+ static inline _Atomic_word
+ __exchange_and_add(volatile _Atomic_word* __mem, int __val)
+ { return __sync_fetch_and_add(__mem, __val); }
+ static inline void
+ __atomic_add(volatile _Atomic_word* __mem, int __val)
+ { __sync_fetch_and_add(__mem, __val); }
+ static inline _Atomic_word
+ __exchange_and_add_single(_Atomic_word* __mem, int __val)
+ {
+ _Atomic_word __result = *__mem;
+ *__mem += __val;
+ return __result;
+ }
+ static inline void
+ __atomic_add_single(_Atomic_word* __mem, int __val)
+ { *__mem += __val; }
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ return __exchange_and_add(__mem, __val);
+ else
+ return __exchange_and_add_single(__mem, __val);
+ }
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ __atomic_add(__mem, __val);
+ else
+ __atomic_add_single(__mem, __val);
+ }
+}
+
+
+namespace __gnu_cxx {
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+ ~new_allocator() throw() { }
+ pointer
+ address(reference __x) const { return &__x; }
+ const_pointer
+ address(const_reference __x) const { return &__x; }
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__n > this->max_size())
+ std::__throw_bad_alloc();
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+ size_type
+ max_size() const throw()
+ { return size_t(-1) / sizeof(_Tp); }
+ void
+ construct(pointer __p, const _Tp& __val)
+ { ::new((void *)__p) _Tp(__val); }
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+ template<typename _Tp>
+ inline bool
+ operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return false; }
+}
+namespace std {
+ template<typename _Tp>
+ class allocator;
+ template<>
+ class allocator<void>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ };
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ allocator() throw() { }
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+ ~allocator() throw() { }
+ };
+ template<typename _T1, typename _T2>
+ inline bool
+ operator==(const allocator<_T1>&, const allocator<_T2>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator==(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return true; }
+ template<typename _T1, typename _T2>
+ inline bool
+ operator!=(const allocator<_T1>&, const allocator<_T2>&)
+ { return false; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return false; }
+ extern template class allocator<char>;
+ extern template class allocator<wchar_t>;
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_swap
+ { static void _S_do_it(_Alloc&, _Alloc&) { } };
+ template<typename _Alloc>
+ struct __alloc_swap<_Alloc, false>
+ {
+ static void
+ _S_do_it(_Alloc& __one, _Alloc& __two)
+ {
+ if (__one != __two)
+ swap(__one, __two);
+ }
+ };
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_neq
+ {
+ static bool
+ _S_do_it(const _Alloc&, const _Alloc&)
+ { return false; }
+ };
+ template<typename _Alloc>
+ struct __alloc_neq<_Alloc, false>
+ {
+ static bool
+ _S_do_it(const _Alloc& __one, const _Alloc& __two)
+ { return __one != __two; }
+ };
+}
+
+
+#pragma GCC visibility push(default)
+namespace __cxxabiv1
+{
+ class __forced_unwind
+ {
+ virtual ~__forced_unwind() throw();
+ virtual void __pure_dummy() = 0;
+ };
+}
+#pragma GCC visibility pop
+namespace std {
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_write(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const streamsize __put = __out.rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ __out.setstate(__ios_base::badbit);
+ }
+ template<typename _CharT, typename _Traits>
+ inline void
+ __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ const _CharT __c = __out.fill();
+ for (; __n > 0; --__n)
+ {
+ const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
+ if (_Traits::eq_int_type(__put, _Traits::eof()))
+ {
+ __out.setstate(__ios_base::badbit);
+ break;
+ }
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
+ const _CharT* __s, streamsize __n)
+ {
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+ typename __ostream_type::sentry __cerb(__out);
+ if (__cerb)
+ {
+ try
+ {
+ const streamsize __w = __out.width();
+ if (__w > __n)
+ {
+ const bool __left = ((__out.flags()
+ & __ios_base::adjustfield)
+ == __ios_base::left);
+ if (!__left)
+ __ostream_fill(__out, __w - __n);
+ if (__out.good())
+ __ostream_write(__out, __s, __n);
+ if (__left && __out.good())
+ __ostream_fill(__out, __w - __n);
+ }
+ else
+ __ostream_write(__out, __s, __n);
+ __out.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(__ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
+ extern template wostream& __ostream_insert(wostream&, const wchar_t*,
+ streamsize);
+}
+namespace std {
+ template<typename _Arg, typename _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Tp>
+ struct plus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x + __y; }
+ };
+ template<typename _Tp>
+ struct minus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x - __y; }
+ };
+ template<typename _Tp>
+ struct multiplies : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x * __y; }
+ };
+ template<typename _Tp>
+ struct divides : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x / __y; }
+ };
+ template<typename _Tp>
+ struct modulus : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x % __y; }
+ };
+ template<typename _Tp>
+ struct negate : public unary_function<_Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x) const
+ { return -__x; }
+ };
+ template<typename _Tp>
+ struct equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x == __y; }
+ };
+ template<typename _Tp>
+ struct not_equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x != __y; }
+ };
+ template<typename _Tp>
+ struct greater : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x > __y; }
+ };
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
+ template<typename _Tp>
+ struct greater_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x >= __y; }
+ };
+ template<typename _Tp>
+ struct less_equal : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x <= __y; }
+ };
+ template<typename _Tp>
+ struct logical_and : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x && __y; }
+ };
+ template<typename _Tp>
+ struct logical_or : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x || __y; }
+ };
+ template<typename _Tp>
+ struct logical_not : public unary_function<_Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x) const
+ { return !__x; }
+ };
+ template<typename _Tp>
+ struct bit_and : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x & __y; }
+ };
+ template<typename _Tp>
+ struct bit_or : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x | __y; }
+ };
+ template<typename _Tp>
+ struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
+ {
+ _Tp
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x ^ __y; }
+ };
+ template<typename _Predicate>
+ class unary_negate
+ : public unary_function<typename _Predicate::argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ unary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::argument_type& __x) const
+ { return !_M_pred(__x); }
+ };
+ template<typename _Predicate>
+ inline unary_negate<_Predicate>
+ not1(const _Predicate& __pred)
+ { return unary_negate<_Predicate>(__pred); }
+ template<typename _Predicate>
+ class binary_negate
+ : public binary_function<typename _Predicate::first_argument_type,
+ typename _Predicate::second_argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
+ public:
+ explicit
+ binary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ bool
+ operator()(const typename _Predicate::first_argument_type& __x,
+ const typename _Predicate::second_argument_type& __y) const
+ { return !_M_pred(__x, __y); }
+ };
+ template<typename _Predicate>
+ inline binary_negate<_Predicate>
+ not2(const _Predicate& __pred)
+ { return binary_negate<_Predicate>(__pred); }
+ template<typename _Arg, typename _Result>
+ class pointer_to_unary_function : public unary_function<_Arg, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg);
+ public:
+ pointer_to_unary_function() { }
+ explicit
+ pointer_to_unary_function(_Result (*__x)(_Arg))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg __x) const
+ { return _M_ptr(__x); }
+ };
+ template<typename _Arg, typename _Result>
+ inline pointer_to_unary_function<_Arg, _Result>
+ ptr_fun(_Result (*__x)(_Arg))
+ { return pointer_to_unary_function<_Arg, _Result>(__x); }
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ class pointer_to_binary_function
+ : public binary_function<_Arg1, _Arg2, _Result>
+ {
+ protected:
+ _Result (*_M_ptr)(_Arg1, _Arg2);
+ public:
+ pointer_to_binary_function() { }
+ explicit
+ pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
+ : _M_ptr(__x) { }
+ _Result
+ operator()(_Arg1 __x, _Arg2 __y) const
+ { return _M_ptr(__x, __y); }
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
+ ptr_fun(_Result (*__x)(_Arg1, _Arg2))
+ { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
+ template<typename _Tp>
+ struct _Identity : public unary_function<_Tp,_Tp>
+ {
+ _Tp&
+ operator()(_Tp& __x) const
+ { return __x; }
+ const _Tp&
+ operator()(const _Tp& __x) const
+ { return __x; }
+ };
+ template<typename _Pair>
+ struct _Select1st : public unary_function<_Pair,
+ typename _Pair::first_type>
+ {
+ typename _Pair::first_type&
+ operator()(_Pair& __x) const
+ { return __x.first; }
+ const typename _Pair::first_type&
+ operator()(const _Pair& __x) const
+ { return __x.first; }
+ };
+ template<typename _Pair>
+ struct _Select2nd : public unary_function<_Pair,
+ typename _Pair::second_type>
+ {
+ typename _Pair::second_type&
+ operator()(_Pair& __x) const
+ { return __x.second; }
+ const typename _Pair::second_type&
+ operator()(const _Pair& __x) const
+ { return __x.second; }
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_t : public unary_function<_Tp*, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p) const
+ { return (__p->*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp>
+ class mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ mem_fun_ref_t(_Ret (_Tp::*__pf)())
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)();
+ };
+ template<typename _Ret, typename _Tp>
+ class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r) const
+ { return (__r.*_M_f)(); }
+ private:
+ _Ret (_Tp::*_M_f)() const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
+ : _M_f(__pf) { }
+ _Ret
+ operator()(_Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg);
+ };
+ template<typename _Ret, typename _Tp, typename _Arg>
+ class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
+ {
+ public:
+ explicit
+ const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) { }
+ _Ret
+ operator()(const _Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+ private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+ };
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)())
+ { return mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_t<_Ret, _Tp>
+ mem_fun(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)())
+ { return mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp>
+ inline const_mem_fun_ref_t<_Ret, _Tp>
+ mem_fun_ref(_Ret (_Tp::*__f)() const)
+ { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_t<_Ret, _Tp, _Arg>
+ mem_fun(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
+ { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+ template<typename _Ret, typename _Tp, typename _Arg>
+ inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
+ mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
+ { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+}
+namespace std {
+ template<typename _Operation>
+ class binder1st
+ : public unary_function<typename _Operation::second_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::first_argument_type value;
+ public:
+ binder1st(const _Operation& __x,
+ const typename _Operation::first_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ typename _Operation::result_type
+ operator()(typename _Operation::second_argument_type& __x) const
+ { return op(value, __x); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder1st<_Operation>
+ bind1st(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::first_argument_type _Arg1_type;
+ return binder1st<_Operation>(__fn, _Arg1_type(__x));
+ }
+ template<typename _Operation>
+ class binder2nd
+ : public unary_function<typename _Operation::first_argument_type,
+ typename _Operation::result_type>
+ {
+ protected:
+ _Operation op;
+ typename _Operation::second_argument_type value;
+ public:
+ binder2nd(const _Operation& __x,
+ const typename _Operation::second_argument_type& __y)
+ : op(__x), value(__y) { }
+ typename _Operation::result_type
+ operator()(const typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ typename _Operation::result_type
+ operator()(typename _Operation::first_argument_type& __x) const
+ { return op(__x, value); }
+ } ;
+ template<typename _Operation, typename _Tp>
+ inline binder2nd<_Operation>
+ bind2nd(const _Operation& __fn, const _Tp& __x)
+ {
+ typedef typename _Operation::second_argument_type _Arg2_type;
+ return binder2nd<_Operation>(__fn, _Arg2_type(__x));
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string
+ {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+ public:
+ typedef _Traits traits_type;
+ typedef typename _Traits::char_type value_type;
+ typedef _Alloc allocator_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ typedef typename _CharT_alloc_type::difference_type difference_type;
+ typedef typename _CharT_alloc_type::reference reference;
+ typedef typename _CharT_alloc_type::const_reference const_reference;
+ typedef typename _CharT_alloc_type::pointer pointer;
+ typedef typename _CharT_alloc_type::const_pointer const_pointer;
+ typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
+ typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
+ const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ private:
+ struct _Rep_base
+ {
+ size_type _M_length;
+ size_type _M_capacity;
+ _Atomic_word _M_refcount;
+ };
+ struct _Rep : _Rep_base
+ {
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
+ static const size_type _S_max_size;
+ static const _CharT _S_terminal;
+ static size_type _S_empty_rep_storage[];
+ static _Rep&
+ _S_empty_rep()
+ {
+ void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
+ return *reinterpret_cast<_Rep*>(__p);
+ }
+ bool
+ _M_is_leaked() const
+ { return this->_M_refcount < 0; }
+ bool
+ _M_is_shared() const
+ { return this->_M_refcount > 0; }
+ void
+ _M_set_leaked()
+ { this->_M_refcount = -1; }
+ void
+ _M_set_sharable()
+ { this->_M_refcount = 0; }
+ void
+ _M_set_length_and_sharable(size_type __n)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ {
+ this->_M_set_sharable();
+ this->_M_length = __n;
+ traits_type::assign(this->_M_refdata()[__n], _S_terminal);
+ }
+ }
+ _CharT*
+ _M_refdata() throw()
+ { return reinterpret_cast<_CharT*>(this + 1); }
+ _CharT*
+ _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
+ {
+ return (!_M_is_leaked() && __alloc1 == __alloc2)
+ ? _M_refcopy() : _M_clone(__alloc1);
+ }
+ static _Rep*
+ _S_create(size_type, size_type, const _Alloc&);
+ void
+ _M_dispose(const _Alloc& __a)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
+ -1) <= 0)
+ _M_destroy(__a);
+ }
+ void
+ _M_destroy(const _Alloc&) throw();
+ _CharT*
+ _M_refcopy() throw()
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
+ return _M_refdata();
+ }
+ _CharT*
+ _M_clone(const _Alloc&, size_type __res = 0);
+ };
+ struct _Alloc_hider : _Alloc
+ {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a)
+ : _Alloc(__a), _M_p(__dat) { }
+ _CharT* _M_p;
+ };
+ public:
+ static const size_type npos = static_cast<size_type>(-1);
+ private:
+ mutable _Alloc_hider _M_dataplus;
+ _CharT*
+ _M_data() const
+ { return _M_dataplus._M_p; }
+ _CharT*
+ _M_data(_CharT* __p)
+ { return (_M_dataplus._M_p = __p); }
+ _Rep*
+ _M_rep() const
+ { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
+ iterator
+ _M_ibegin() const
+ { return iterator(_M_data()); }
+ iterator
+ _M_iend() const
+ { return iterator(_M_data() + this->size()); }
+ void
+ _M_leak()
+ {
+ if (!_M_rep()->_M_is_leaked())
+ _M_leak_hard();
+ }
+ size_type
+ _M_check(size_type __pos, const char* __s) const
+ {
+ if (__pos > this->size())
+ __throw_out_of_range((__s));
+ return __pos;
+ }
+ void
+ _M_check_length(size_type __n1, size_type __n2, const char* __s) const
+ {
+ if (this->max_size() - (this->size() - __n1) < __n2)
+ __throw_length_error((__s));
+ }
+ size_type
+ _M_limit(size_type __pos, size_type __off) const
+ {
+ const bool __testoff = __off < this->size() - __pos;
+ return __testoff ? __off : this->size() - __pos;
+ }
+ bool
+ _M_disjunct(const _CharT* __s) const
+ {
+ return (less<const _CharT*>()(__s, _M_data())
+ || less<const _CharT*>()(_M_data() + this->size(), __s));
+ }
+ static void
+ _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::copy(__d, __s, __n);
+ }
+ static void
+ _M_move(_CharT* __d, const _CharT* __s, size_type __n)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, *__s);
+ else
+ traits_type::move(__d, __s, __n);
+ }
+ static void
+ _M_assign(_CharT* __d, size_type __n, _CharT __c)
+ {
+ if (__n == 1)
+ traits_type::assign(*__d, __c);
+ else
+ traits_type::assign(__d, __n, __c);
+ }
+ template<class _Iterator>
+ static void
+ _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
+ {
+ for (; __k1 != __k2; ++__k1, ++__p)
+ traits_type::assign(*__p, *__k1);
+ }
+ static void
+ _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
+ { _S_copy_chars(__p, __k1.base(), __k2.base()); }
+ static void
+ _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static void
+ _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
+ { _M_copy(__p, __k1, __k2 - __k1); }
+ static int
+ _S_compare(size_type __n1, size_type __n2)
+ {
+ const difference_type __d = difference_type(__n1 - __n2);
+ if (__d > __gnu_cxx::__numeric_traits<int>::__max)
+ return __gnu_cxx::__numeric_traits<int>::__max;
+ else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
+ return __gnu_cxx::__numeric_traits<int>::__min;
+ else
+ return int(__d);
+ }
+ void
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2);
+ void
+ _M_leak_hard();
+ static _Rep&
+ _S_empty_rep()
+ { return _Rep::_S_empty_rep(); }
+ public:
+ basic_string()
+ : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
+ explicit
+ basic_string(const _Alloc& __a);
+ basic_string(const basic_string& __str);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n = npos);
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a);
+ basic_string(const _CharT* __s, size_type __n,
+ const _Alloc& __a = _Alloc());
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
+ template<class _InputIterator>
+ basic_string(_InputIterator __beg, _InputIterator __end,
+ const _Alloc& __a = _Alloc());
+ ~basic_string()
+ { _M_rep()->_M_dispose(this->get_allocator()); }
+ basic_string&
+ operator=(const basic_string& __str)
+ { return this->assign(__str); }
+ basic_string&
+ operator=(const _CharT* __s)
+ { return this->assign(__s); }
+ basic_string&
+ operator=(_CharT __c)
+ {
+ this->assign(1, __c);
+ return *this;
+ }
+ iterator
+ begin()
+ {
+ _M_leak();
+ return iterator(_M_data());
+ }
+ const_iterator
+ begin() const
+ { return const_iterator(_M_data()); }
+ iterator
+ end()
+ {
+ _M_leak();
+ return iterator(_M_data() + this->size());
+ }
+ const_iterator
+ end() const
+ { return const_iterator(_M_data() + this->size()); }
+ reverse_iterator
+ rbegin()
+ { return reverse_iterator(this->end()); }
+ const_reverse_iterator
+ rbegin() const
+ { return const_reverse_iterator(this->end()); }
+ reverse_iterator
+ rend()
+ { return reverse_iterator(this->begin()); }
+ const_reverse_iterator
+ rend() const
+ { return const_reverse_iterator(this->begin()); }
+ public:
+ size_type
+ size() const
+ { return _M_rep()->_M_length; }
+ size_type
+ length() const
+ { return _M_rep()->_M_length; }
+ size_type
+ max_size() const
+ { return _Rep::_S_max_size; }
+ void
+ resize(size_type __n, _CharT __c);
+ void
+ resize(size_type __n)
+ { this->resize(__n, _CharT()); }
+ size_type
+ capacity() const
+ { return _M_rep()->_M_capacity; }
+ void
+ reserve(size_type __res_arg = 0);
+ void
+ clear()
+ { _M_mutate(0, this->size(), 0); }
+ bool
+ empty() const
+ { return this->size() == 0; }
+ const_reference
+ operator[] (size_type __pos) const
+ {
+ ;
+ return _M_data()[__pos];
+ }
+ reference
+ operator[](size_type __pos)
+ {
+ ;
+ ;
+ _M_leak();
+ return _M_data()[__pos];
+ }
+ const_reference
+ at(size_type __n) const
+ {
+ if (__n >= this->size())
+ __throw_out_of_range(("basic_string::at"));
+ return _M_data()[__n];
+ }
+ reference
+ at(size_type __n)
+ {
+ if (__n >= size())
+ __throw_out_of_range(("basic_string::at"));
+ _M_leak();
+ return _M_data()[__n];
+ }
+ basic_string&
+ operator+=(const basic_string& __str)
+ { return this->append(__str); }
+ basic_string&
+ operator+=(const _CharT* __s)
+ { return this->append(__s); }
+ basic_string&
+ operator+=(_CharT __c)
+ {
+ this->push_back(__c);
+ return *this;
+ }
+ basic_string&
+ append(const basic_string& __str);
+ basic_string&
+ append(const basic_string& __str, size_type __pos, size_type __n);
+ basic_string&
+ append(const _CharT* __s, size_type __n);
+ basic_string&
+ append(const _CharT* __s)
+ {
+ ;
+ return this->append(__s, traits_type::length(__s));
+ }
+ basic_string&
+ append(size_type __n, _CharT __c);
+ template<class _InputIterator>
+ basic_string&
+ append(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_iend(), _M_iend(), __first, __last); }
+ void
+ push_back(_CharT __c)
+ {
+ const size_type __len = 1 + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ traits_type::assign(_M_data()[this->size()], __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ basic_string&
+ assign(const basic_string& __str);
+ basic_string&
+ assign(const basic_string& __str, size_type __pos, size_type __n)
+ { return this->assign(__str._M_data()
+ + __str._M_check(__pos, "basic_string::assign"),
+ __str._M_limit(__pos, __n)); }
+ basic_string&
+ assign(const _CharT* __s, size_type __n);
+ basic_string&
+ assign(const _CharT* __s)
+ {
+ ;
+ return this->assign(__s, traits_type::length(__s));
+ }
+ basic_string&
+ assign(size_type __n, _CharT __c)
+ { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
+ template<class _InputIterator>
+ basic_string&
+ assign(_InputIterator __first, _InputIterator __last)
+ { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
+ void
+ insert(iterator __p, size_type __n, _CharT __c)
+ { this->replace(__p, __p, __n, __c); }
+ template<class _InputIterator>
+ void
+ insert(iterator __p, _InputIterator __beg, _InputIterator __end)
+ { this->replace(__p, __p, __beg, __end); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str)
+ { return this->insert(__pos1, __str, size_type(0), __str.size()); }
+ basic_string&
+ insert(size_type __pos1, const basic_string& __str,
+ size_type __pos2, size_type __n)
+ { return this->insert(__pos1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::insert"),
+ __str._M_limit(__pos2, __n)); }
+ basic_string&
+ insert(size_type __pos, const _CharT* __s, size_type __n);
+ basic_string&
+ insert(size_type __pos, const _CharT* __s)
+ {
+ ;
+ return this->insert(__pos, __s, traits_type::length(__s));
+ }
+ basic_string&
+ insert(size_type __pos, size_type __n, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
+ size_type(0), __n, __c); }
+ iterator
+ insert(iterator __p, _CharT __c)
+ {
+ ;
+ const size_type __pos = __p - _M_ibegin();
+ _M_replace_aux(__pos, size_type(0), size_type(1), __c);
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ basic_string&
+ erase(size_type __pos = 0, size_type __n = npos)
+ {
+ _M_mutate(_M_check(__pos, "basic_string::erase"),
+ _M_limit(__pos, __n), size_type(0));
+ return *this;
+ }
+ iterator
+ erase(iterator __position)
+ {
+ ;
+ const size_type __pos = __position - _M_ibegin();
+ _M_mutate(__pos, size_type(1), size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ iterator
+ erase(iterator __first, iterator __last);
+ basic_string&
+ replace(size_type __pos, size_type __n, const basic_string& __str)
+ { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2)
+ { return this->replace(__pos1, __n1, __str._M_data()
+ + __str._M_check(__pos2, "basic_string::replace"),
+ __str._M_limit(__pos2, __n2)); }
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ basic_string&
+ replace(size_type __pos, size_type __n1, const _CharT* __s)
+ {
+ ;
+ return this->replace(__pos, __n1, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
+ { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
+ _M_limit(__pos, __n1), __n2, __c); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const basic_string& __str)
+ { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
+ {
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, const _CharT* __s)
+ {
+ ;
+ return this->replace(__i1, __i2, __s, traits_type::length(__s));
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
+ {
+ ;
+ return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
+ }
+ template<class _InputIterator>
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ _InputIterator __k1, _InputIterator __k2)
+ {
+ ;
+ ;
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const _CharT* __k1, const _CharT* __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1, __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ basic_string&
+ replace(iterator __i1, iterator __i2,
+ const_iterator __k1, const_iterator __k2)
+ {
+ ;
+ ;
+ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
+ __k1.base(), __k2 - __k1);
+ }
+ private:
+ template<class _Integer>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
+ _Integer __val, __true_type)
+ { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
+ template<class _InputIterator>
+ basic_string&
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type);
+ basic_string&
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c);
+ basic_string&
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2);
+ template<class _InIterator>
+ static _CharT*
+ _S_construct_aux(_InIterator __beg, _InIterator __end,
+ const _Alloc& __a, __false_type)
+ {
+ typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
+ return _S_construct(__beg, __end, __a, _Tag());
+ }
+ template<class _Integer>
+ static _CharT*
+ _S_construct_aux(_Integer __beg, _Integer __end,
+ const _Alloc& __a, __true_type)
+ { return _S_construct_aux_2(static_cast<size_type>(__beg),
+ __end, __a); }
+ static _CharT*
+ _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
+ { return _S_construct(__req, __c, __a); }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
+ {
+ typedef typename std::__is_integer<_InIterator>::__type _Integral;
+ return _S_construct_aux(__beg, __end, __a, _Integral());
+ }
+ template<class _InIterator>
+ static _CharT*
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag);
+ template<class _FwdIterator>
+ static _CharT*
+ _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
+ forward_iterator_tag);
+ static _CharT*
+ _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
+ public:
+ size_type
+ copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
+ void
+ swap(basic_string& __s);
+ const _CharT*
+ c_str() const
+ { return _M_data(); }
+ const _CharT*
+ data() const
+ { return _M_data(); }
+ allocator_type
+ get_allocator() const
+ { return _M_dataplus; }
+ size_type
+ find(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find(const basic_string& __str, size_type __pos = 0) const
+ { return this->find(__str.data(), __pos, __str.size()); }
+ size_type
+ find(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find(_CharT __c, size_type __pos = 0) const;
+ size_type
+ rfind(const basic_string& __str, size_type __pos = npos) const
+ { return this->rfind(__str.data(), __pos, __str.size()); }
+ size_type
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ rfind(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->rfind(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ rfind(_CharT __c, size_type __pos = npos) const;
+ size_type
+ find_first_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_first_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_of(_CharT __c, size_type __pos = 0) const
+ { return this->find(__c, __pos); }
+ size_type
+ find_last_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
+ size_type
+ find_last_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_of(_CharT __c, size_type __pos = npos) const
+ { return this->rfind(__c, __pos); }
+ size_type
+ find_first_not_of(const basic_string& __str, size_type __pos = 0) const
+ { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos = 0) const
+ {
+ ;
+ return this->find_first_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_first_not_of(_CharT __c, size_type __pos = 0) const;
+ size_type
+ find_last_not_of(const basic_string& __str, size_type __pos = npos) const
+ { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos,
+ size_type __n) const;
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos = npos) const
+ {
+ ;
+ return this->find_last_not_of(__s, __pos, traits_type::length(__s));
+ }
+ size_type
+ find_last_not_of(_CharT __c, size_type __pos = npos) const;
+ basic_string
+ substr(size_type __pos = 0, size_type __n = npos) const
+ { return basic_string(*this,
+ _M_check(__pos, "basic_string::substr"), __n); }
+ int
+ compare(const basic_string& __str) const
+ {
+ const size_type __size = this->size();
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ int
+ compare(size_type __pos, size_type __n, const basic_string& __str) const;
+ int
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const;
+ int
+ compare(const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const;
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const;
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT,_Traits,_Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ {
+ basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_string<_CharT, _Traits, _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str(__lhs);
+ __str.append(__size_type(1), __rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT>
+ inline
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
+ operator==(const basic_string<_CharT>& __lhs,
+ const basic_string<_CharT>& __rhs)
+ { return (__lhs.size() == __rhs.size()
+ && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
+ __lhs.size())); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) == 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return !(__lhs == __rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) > 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) < 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator<=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const _CharT* __rhs)
+ { return __lhs.compare(__rhs) >= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline bool
+ operator>=(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { return __rhs.compare(__lhs) <= 0; }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline void
+ swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ { __lhs.swap(__rhs); }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __is, basic_string<char>& __str);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ return __ostream_insert(__os, __str.data(), __str.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ inline basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ { return getline(__is, __str, __is.widen('\n')); }
+ template<>
+ basic_istream<char>&
+ getline(basic_istream<char>& __in, basic_string<char>& __str,
+ char __delim);
+ template<>
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
+ wchar_t __delim);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const _CharT
+ basic_string<_CharT, _Traits, _Alloc>::
+ _Rep::_S_terminal = _CharT();
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ const typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::npos;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
+ (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
+ sizeof(size_type)];
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ input_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _CharT __buf[128];
+ size_type __len = 0;
+ while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))
+ {
+ __buf[__len++] = *__beg;
+ ++__beg;
+ }
+ _Rep* __r = _Rep::_S_create(__len, size_type(0), __a);
+ _M_copy(__r->_M_refdata(), __buf, __len);
+ try
+ {
+ while (__beg != __end)
+ {
+ if (__len == __r->_M_capacity)
+ {
+ _Rep* __another = _Rep::_S_create(__len + 1, __len, __a);
+ _M_copy(__another->_M_refdata(), __r->_M_refdata(), __len);
+ __r->_M_destroy(__a);
+ __r = __another;
+ }
+ __r->_M_refdata()[__len++] = *__beg;
+ ++__beg;
+ }
+ }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__len);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template <typename _InIterator>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
+ forward_iterator_tag)
+ {
+ if (__beg == __end && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
+ __throw_logic_error(("basic_string::_S_construct NULL not valid"));
+ const size_type __dnew = static_cast<size_type>(std::distance(__beg,
+ __end));
+ _Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);
+ try
+ { _S_copy_chars(__r->_M_refdata(), __beg, __end); }
+ catch(...)
+ {
+ __r->_M_destroy(__a);
+ throw;
+ }
+ __r->_M_set_length_and_sharable(__dnew);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::
+ _S_construct(size_type __n, _CharT __c, const _Alloc& __a)
+ {
+ if (__n == 0 && __a == _Alloc())
+ return _S_empty_rep()._M_refdata();
+ _Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
+ if (__n)
+ _M_assign(__r->_M_refdata(), __n, __c);
+ __r->_M_set_length_and_sharable(__n);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str)
+ : _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()),
+ __str.get_allocator()),
+ __str.get_allocator())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _Alloc& __a)
+ : _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos, size_type __n)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, _Alloc()), _Alloc())
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const basic_string& __str, size_type __pos,
+ size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__str._M_data()
+ + __str._M_check(__pos,
+ "basic_string::basic_string"),
+ __str._M_data() + __str._M_limit(__pos, __n)
+ + __pos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(const _CharT* __s, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
+ __s + npos, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(size_type __n, _CharT __c, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__n, __c, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>::
+ basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
+ : _M_dataplus(_S_construct(__beg, __end, __a), __a)
+ { }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const basic_string& __str)
+ {
+ if (_M_rep() != __str._M_rep())
+ {
+ const allocator_type __a = this->get_allocator();
+ _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ assign(const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check_length(this->size(), __n, "basic_string::assign");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(size_type(0), this->size(), __s, __n);
+ else
+ {
+ const size_type __pos = __s - _M_data();
+ if (__pos >= __n)
+ _M_copy(_M_data(), __s, __n);
+ else if (__pos)
+ _M_move(_M_data(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__n);
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(size_type __n, _CharT __c)
+ {
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_assign(_M_data() + this->size(), __n, __c);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const _CharT* __s, size_type __n)
+ {
+ ;
+ if (__n)
+ {
+ _M_check_length(size_type(0), __n, "basic_string::append");
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (_M_disjunct(__s))
+ this->reserve(__len);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ this->reserve(__len);
+ __s = _M_data() + __off;
+ }
+ }
+ _M_copy(_M_data() + this->size(), __s, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str)
+ {
+ const size_type __size = __str.size();
+ if (__size)
+ {
+ const size_type __len = __size + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data(), __size);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ append(const basic_string& __str, size_type __pos, size_type __n)
+ {
+ __str._M_check(__pos, "basic_string::append");
+ __n = __str._M_limit(__pos, __n);
+ if (__n)
+ {
+ const size_type __len = __n + this->size();
+ if (__len > this->capacity() || _M_rep()->_M_is_shared())
+ this->reserve(__len);
+ _M_copy(_M_data() + this->size(), __str._M_data() + __pos, __n);
+ _M_rep()->_M_set_length_and_sharable(__len);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ insert(size_type __pos, const _CharT* __s, size_type __n)
+ {
+ ;
+ _M_check(__pos, "basic_string::insert");
+ _M_check_length(size_type(0), __n, "basic_string::insert");
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, size_type(0), __s, __n);
+ else
+ {
+ const size_type __off = __s - _M_data();
+ _M_mutate(__pos, 0, __n);
+ __s = _M_data() + __off;
+ _CharT* __p = _M_data() + __pos;
+ if (__s + __n <= __p)
+ _M_copy(__p, __s, __n);
+ else if (__s >= __p)
+ _M_copy(__p, __s + __n, __n);
+ else
+ {
+ const size_type __nleft = __p - __s;
+ _M_copy(__p, __s, __nleft);
+ _M_copy(__p + __nleft, __p + __n, __n - __nleft);
+ }
+ return *this;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::iterator
+ basic_string<_CharT, _Traits, _Alloc>::
+ erase(iterator __first, iterator __last)
+ {
+ ;
+ const size_type __size = __last - __first;
+ if (__size)
+ {
+ const size_type __pos = __first - _M_ibegin();
+ _M_mutate(__pos, __size, size_type(0));
+ _M_rep()->_M_set_leaked();
+ return iterator(_M_data() + __pos);
+ }
+ else
+ return __first;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ replace(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ ;
+ _M_check(__pos, "basic_string::replace");
+ __n1 = _M_limit(__pos, __n1);
+ _M_check_length(__n1, __n2, "basic_string::replace");
+ bool __left;
+ if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
+ return _M_replace_safe(__pos, __n1, __s, __n2);
+ else if ((__left = __s + __n2 <= _M_data() + __pos)
+ || _M_data() + __pos + __n1 <= __s)
+ {
+ size_type __off = __s - _M_data();
+ __left ? __off : (__off += __n2 - __n1);
+ _M_mutate(__pos, __n1, __n2);
+ _M_copy(_M_data() + __pos, _M_data() + __off, __n2);
+ return *this;
+ }
+ else
+ {
+ const basic_string __tmp(__s, __n2);
+ return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_destroy(const _Alloc& __a) throw ()
+ {
+ const size_type __size = sizeof(_Rep_base) +
+ (this->_M_capacity + 1) * sizeof(_CharT);
+ _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_leak_hard()
+ {
+ if (_M_rep() == &_S_empty_rep())
+ return;
+ if (_M_rep()->_M_is_shared())
+ _M_mutate(0, 0, 0);
+ _M_rep()->_M_set_leaked();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_mutate(size_type __pos, size_type __len1, size_type __len2)
+ {
+ const size_type __old_size = this->size();
+ const size_type __new_size = __old_size + __len2 - __len1;
+ const size_type __how_much = __old_size - __pos - __len1;
+ if (__new_size > this->capacity() || _M_rep()->_M_is_shared())
+ {
+ const allocator_type __a = get_allocator();
+ _Rep* __r = _Rep::_S_create(__new_size, this->capacity(), __a);
+ if (__pos)
+ _M_copy(__r->_M_refdata(), _M_data(), __pos);
+ if (__how_much)
+ _M_copy(__r->_M_refdata() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ _M_rep()->_M_dispose(__a);
+ _M_data(__r->_M_refdata());
+ }
+ else if (__how_much && __len1 != __len2)
+ {
+ _M_move(_M_data() + __pos + __len2,
+ _M_data() + __pos + __len1, __how_much);
+ }
+ _M_rep()->_M_set_length_and_sharable(__new_size);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ reserve(size_type __res)
+ {
+ if (__res != this->capacity() || _M_rep()->_M_is_shared())
+ {
+ if (__res < this->size())
+ __res = this->size();
+ const allocator_type __a = get_allocator();
+ _CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
+ _M_rep()->_M_dispose(__a);
+ _M_data(__tmp);
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ swap(basic_string& __s)
+ {
+ if (_M_rep()->_M_is_leaked())
+ _M_rep()->_M_set_sharable();
+ if (__s._M_rep()->_M_is_leaked())
+ __s._M_rep()->_M_set_sharable();
+ if (this->get_allocator() == __s.get_allocator())
+ {
+ _CharT* __tmp = _M_data();
+ _M_data(__s._M_data());
+ __s._M_data(__tmp);
+ }
+ else
+ {
+ const basic_string __tmp1(_M_ibegin(), _M_iend(),
+ __s.get_allocator());
+ const basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
+ this->get_allocator());
+ *this = __tmp2;
+ __s = __tmp1;
+ }
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _S_create(size_type __capacity, size_type __old_capacity,
+ const _Alloc& __alloc)
+ {
+ if (__capacity > _S_max_size)
+ __throw_length_error(("basic_string::_S_create"));
+ const size_type __pagesize = 4096;
+ const size_type __malloc_header_size = 4 * sizeof(void*);
+ if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
+ __capacity = 2 * __old_capacity;
+ size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ const size_type __adj_size = __size + __malloc_header_size;
+ if (__adj_size > __pagesize && __capacity > __old_capacity)
+ {
+ const size_type __extra = __pagesize - __adj_size % __pagesize;
+ __capacity += __extra / sizeof(_CharT);
+ if (__capacity > _S_max_size)
+ __capacity = _S_max_size;
+ __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+ }
+ void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
+ _Rep *__p = new (__place) _Rep;
+ __p->_M_capacity = __capacity;
+ __p->_M_set_sharable();
+ return __p;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ _CharT*
+ basic_string<_CharT, _Traits, _Alloc>::_Rep::
+ _M_clone(const _Alloc& __alloc, size_type __res)
+ {
+ const size_type __requested_cap = this->_M_length + __res;
+ _Rep* __r = _Rep::_S_create(__requested_cap, this->_M_capacity,
+ __alloc);
+ if (this->_M_length)
+ _M_copy(__r->_M_refdata(), _M_refdata(), this->_M_length);
+ __r->_M_set_length_and_sharable(this->_M_length);
+ return __r->_M_refdata();
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ resize(size_type __n, _CharT __c)
+ {
+ const size_type __size = this->size();
+ _M_check_length(__size, __n, "basic_string::resize");
+ if (__size < __n)
+ this->append(__n - __size, __c);
+ else if (__n < __size)
+ this->erase(__n);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _InputIterator>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
+ _InputIterator __k2, __false_type)
+ {
+ const basic_string __s(__k1, __k2);
+ const size_type __n1 = __i2 - __i1;
+ _M_check_length(__n1, __s.size(), "basic_string::_M_replace_dispatch");
+ return _M_replace_safe(__i1 - _M_ibegin(), __n1, __s._M_data(),
+ __s.size());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
+ _CharT __c)
+ {
+ _M_check_length(__n1, __n2, "basic_string::_M_replace_aux");
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_assign(_M_data() + __pos1, __n2, __c);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>&
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
+ size_type __n2)
+ {
+ _M_mutate(__pos1, __n1, __n2);
+ if (__n2)
+ _M_copy(_M_data() + __pos1, __s, __n2);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(const _CharT* __lhs,
+ const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ ;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ const __size_type __len = _Traits::length(__lhs);
+ __string_type __str;
+ __str.reserve(__len + __rhs.size());
+ __str.append(__lhs, __len);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_string<_CharT, _Traits, _Alloc>
+ operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __string_type::size_type __size_type;
+ __string_type __str;
+ const __size_type __len = __rhs.size();
+ __str.reserve(__len + 1);
+ __str.append(__size_type(1), __lhs);
+ __str.append(__rhs);
+ return __str;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ copy(_CharT* __s, size_type __n, size_type __pos) const
+ {
+ _M_check(__pos, "basic_string::copy");
+ __n = _M_limit(__pos, __n);
+ ;
+ if (__n)
+ _M_copy(__s, _M_data() + __pos, __n);
+ return __n;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ const _CharT* __data = _M_data();
+ if (__n == 0)
+ return __pos <= __size ? __pos : npos;
+ if (__n <= __size)
+ {
+ for (; __pos <= __size - __n; ++__pos)
+ if (traits_type::eq(__data[__pos], __s[0])
+ && traits_type::compare(__data + __pos + 1,
+ __s + 1, __n - 1) == 0)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find(_CharT __c, size_type __pos) const
+ {
+ size_type __ret = npos;
+ const size_type __size = this->size();
+ if (__pos < __size)
+ {
+ const _CharT* __data = _M_data();
+ const size_type __n = __size - __pos;
+ const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
+ if (__p)
+ __ret = __p - __data;
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ const size_type __size = this->size();
+ if (__n <= __size)
+ {
+ __pos = std::min(size_type(__size - __n), __pos);
+ const _CharT* __data = _M_data();
+ do
+ {
+ if (traits_type::compare(__data + __pos, __s, __n) == 0)
+ return __pos;
+ }
+ while (__pos-- > 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ rfind(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ for (++__size; __size-- > 0; )
+ if (traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __n && __pos < this->size(); ++__pos)
+ {
+ const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
+ if (__p)
+ return __pos;
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size && __n)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size-- != 0);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::find(__s, __n, _M_data()[__pos]))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_first_not_of(_CharT __c, size_type __pos) const
+ {
+ for (; __pos < this->size(); ++__pos)
+ if (!traits_type::eq(_M_data()[__pos], __c))
+ return __pos;
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+ {
+ ;
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::find(__s, __n, _M_data()[__size]))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
+ basic_string<_CharT, _Traits, _Alloc>::
+ find_last_not_of(_CharT __c, size_type __pos) const
+ {
+ size_type __size = this->size();
+ if (__size)
+ {
+ if (--__size > __pos)
+ __size = __pos;
+ do
+ {
+ if (!traits_type::eq(_M_data()[__size], __c))
+ return __size;
+ }
+ while (__size--);
+ }
+ return npos;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n, const basic_string& __str) const
+ {
+ _M_check(__pos, "basic_string::compare");
+ __n = _M_limit(__pos, __n);
+ const size_type __osize = __str.size();
+ const size_type __len = std::min(__n, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
+ if (!__r)
+ __r = _S_compare(__n, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(size_type __pos1, size_type __n1, const basic_string& __str,
+ size_type __pos2, size_type __n2) const
+ {
+ _M_check(__pos1, "basic_string::compare");
+ __str._M_check(__pos2, "basic_string::compare");
+ __n1 = _M_limit(__pos1, __n1);
+ __n2 = __str._M_limit(__pos2, __n2);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos1,
+ __str.data() + __pos2, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string<_CharT, _Traits, _Alloc>::
+ compare(const _CharT* __s) const
+ {
+ ;
+ const size_type __size = this->size();
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__size, __osize);
+ int __r = traits_type::compare(_M_data(), __s, __len);
+ if (!__r)
+ __r = _S_compare(__size, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __osize = traits_type::length(__s);
+ const size_type __len = std::min(__n1, __osize);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __osize);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ int
+ basic_string <_CharT, _Traits, _Alloc>::
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
+ size_type __n2) const
+ {
+ ;
+ _M_check(__pos, "basic_string::compare");
+ __n1 = _M_limit(__pos, __n1);
+ const size_type __len = std::min(__n1, __n2);
+ int __r = traits_type::compare(_M_data() + __pos, __s, __len);
+ if (!__r)
+ __r = _S_compare(__n1, __n2);
+ return __r;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef typename __ctype_type::ctype_base __ctype_base;
+ __size_type __extracted = 0;
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ _CharT __buf[128];
+ __size_type __len = 0;
+ const streamsize __w = __in.width();
+ const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
+ : __str.max_size();
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(__ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ if (__len == sizeof(__buf) / sizeof(_CharT))
+ {
+ __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
+ __len = 0;
+ }
+ __buf[__len++] = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ __str.append(__buf, __len);
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ basic_istream<_CharT, _Traits>&
+ getline(basic_istream<_CharT, _Traits>& __in,
+ basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef typename __istream_type::ios_base __ios_base;
+ typedef typename __istream_type::int_type __int_type;
+ typedef typename __string_type::size_type __size_type;
+ __size_type __extracted = 0;
+ const __size_type __n = __str.max_size();
+ typename __ios_base::iostate __err = __ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, true);
+ if (__cerb)
+ {
+ try
+ {
+ __str.erase();
+ const __int_type __idelim = _Traits::to_int_type(__delim);
+ const __int_type __eof = _Traits::eof();
+ __int_type __c = __in.rdbuf()->sgetc();
+ while (__extracted < __n
+ && !_Traits::eq_int_type(__c, __eof)
+ && !_Traits::eq_int_type(__c, __idelim))
+ {
+ __str += _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __in.rdbuf()->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= __ios_base::eofbit;
+ else if (_Traits::eq_int_type(__c, __idelim))
+ {
+ ++__extracted;
+ __in.rdbuf()->sbumpc();
+ }
+ else
+ __err |= __ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ {
+ __in._M_setstate(__ios_base::badbit);
+ }
+ }
+ if (!__extracted)
+ __err |= __ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ extern template class basic_string<char>;
+ extern template
+ basic_istream<char>&
+ operator>>(basic_istream<char>&, string&);
+ extern template
+ basic_ostream<char>&
+ operator<<(basic_ostream<char>&, const string&);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&, char);
+ extern template
+ basic_istream<char>&
+ getline(basic_istream<char>&, string&);
+ extern template class basic_string<wchar_t>;
+ extern template
+ basic_istream<wchar_t>&
+ operator>>(basic_istream<wchar_t>&, wstring&);
+ extern template
+ basic_ostream<wchar_t>&
+ operator<<(basic_ostream<wchar_t>&, const wstring&);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&, wchar_t);
+ extern template
+ basic_istream<wchar_t>&
+ getline(basic_istream<wchar_t>&, wstring&);
+}
+namespace std {
+ class locale
+ {
+ public:
+ typedef int category;
+ class facet;
+ class id;
+ class _Impl;
+ friend class facet;
+ friend class _Impl;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ static const category none = 0;
+ static const category ctype = 1L << 0;
+ static const category numeric = 1L << 1;
+ static const category collate = 1L << 2;
+ static const category time = 1L << 3;
+ static const category monetary = 1L << 4;
+ static const category messages = 1L << 5;
+ static const category all = (ctype | numeric | collate |
+ time | monetary | messages);
+ locale() throw();
+ locale(const locale& __other) throw();
+ explicit
+ locale(const char* __s);
+ locale(const locale& __base, const char* __s, category __cat);
+ locale(const locale& __base, const locale& __add, category __cat);
+ template<typename _Facet>
+ locale(const locale& __other, _Facet* __f);
+ ~locale() throw();
+ const locale&
+ operator=(const locale& __other) throw();
+ template<typename _Facet>
+ locale
+ combine(const locale& __other) const;
+ string
+ name() const;
+ bool
+ operator==(const locale& __other) const throw();
+ bool
+ operator!=(const locale& __other) const throw()
+ { return !(this->operator==(__other)); }
+ template<typename _Char, typename _Traits, typename _Alloc>
+ bool
+ operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
+ const basic_string<_Char, _Traits, _Alloc>& __s2) const;
+ static locale
+ global(const locale&);
+ static const locale&
+ classic();
+ private:
+ _Impl* _M_impl;
+ static _Impl* _S_classic;
+ static _Impl* _S_global;
+ static const char* const* const _S_categories;
+ enum { _S_categories_size = 6 + 0 };
+ static __gthread_once_t _S_once;
+ explicit
+ locale(_Impl*) throw();
+ static void
+ _S_initialize();
+ static void
+ _S_initialize_once() throw();
+ static category
+ _S_normalize_category(category);
+ void
+ _M_coalesce(const locale& __base, const locale& __add, category __cat);
+ };
+ class locale::facet
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ mutable _Atomic_word _M_refcount;
+ static __c_locale _S_c_locale;
+ static const char _S_c_name[2];
+ static __gthread_once_t _S_once;
+ static void
+ _S_initialize_once();
+ protected:
+ explicit
+ facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
+ { }
+ virtual
+ ~facet();
+ static void
+ _S_create_c_locale(__c_locale& __cloc, const char* __s,
+ __c_locale __old = 0);
+ static __c_locale
+ _S_clone_c_locale(__c_locale& __cloc) throw();
+ static void
+ _S_destroy_c_locale(__c_locale& __cloc);
+ static __c_locale
+ _S_lc_ctype_c_locale(__c_locale __cloc, const char* __s);
+ static __c_locale
+ _S_get_c_locale();
+ __attribute__ ((__const__)) static const char*
+ _S_get_c_name() throw();
+ private:
+ void
+ _M_add_reference() const throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() const throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ facet(const facet&);
+ facet&
+ operator=(const facet&);
+ };
+ class locale::id
+ {
+ private:
+ friend class locale;
+ friend class locale::_Impl;
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ mutable size_t _M_index;
+ static _Atomic_word _S_refcount;
+ void
+ operator=(const id&);
+ id(const id&);
+ public:
+ id() { }
+ size_t
+ _M_id() const throw();
+ };
+ class locale::_Impl
+ {
+ public:
+ friend class locale;
+ friend class locale::facet;
+ template<typename _Facet>
+ friend bool
+ has_facet(const locale&) throw();
+ template<typename _Facet>
+ friend const _Facet&
+ use_facet(const locale&);
+ template<typename _Cache>
+ friend struct __use_cache;
+ private:
+ _Atomic_word _M_refcount;
+ const facet** _M_facets;
+ size_t _M_facets_size;
+ const facet** _M_caches;
+ char** _M_names;
+ static const locale::id* const _S_id_ctype[];
+ static const locale::id* const _S_id_numeric[];
+ static const locale::id* const _S_id_collate[];
+ static const locale::id* const _S_id_time[];
+ static const locale::id* const _S_id_monetary[];
+ static const locale::id* const _S_id_messages[];
+ static const locale::id* const* const _S_facet_categories[];
+ void
+ _M_add_reference() throw()
+ { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ void
+ _M_remove_reference() throw()
+ {
+ if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
+ {
+ try
+ { delete this; }
+ catch(...)
+ { }
+ }
+ }
+ _Impl(const _Impl&, size_t);
+ _Impl(const char*, size_t);
+ _Impl(size_t) throw();
+ ~_Impl() throw();
+ _Impl(const _Impl&);
+ void
+ operator=(const _Impl&);
+ bool
+ _M_check_same_name()
+ {
+ bool __ret = true;
+ if (_M_names[1])
+ for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
+ __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
+ return __ret;
+ }
+ void
+ _M_replace_categories(const _Impl*, category);
+ void
+ _M_replace_category(const _Impl*, const locale::id* const*);
+ void
+ _M_replace_facet(const _Impl*, const locale::id*);
+ void
+ _M_install_facet(const locale::id*, const facet*);
+ template<typename _Facet>
+ void
+ _M_init_facet(_Facet* __facet)
+ { _M_install_facet(&_Facet::id, __facet); }
+ void
+ _M_install_cache(const facet*, size_t);
+ };
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw();
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc);
+ template<typename _CharT>
+ class collate : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ protected:
+ __c_locale _M_c_locale_collate;
+ public:
+ static locale::id id;
+ explicit
+ collate(size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
+ { }
+ explicit
+ collate(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
+ { }
+ int
+ compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
+ string_type
+ transform(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_transform(__lo, __hi); }
+ long
+ hash(const _CharT* __lo, const _CharT* __hi) const
+ { return this->do_hash(__lo, __hi); }
+ int
+ _M_compare(const _CharT*, const _CharT*) const throw();
+ size_t
+ _M_transform(_CharT*, const _CharT*, size_t) const throw();
+ protected:
+ virtual
+ ~collate()
+ { _S_destroy_c_locale(_M_c_locale_collate); }
+ virtual int
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const;
+ virtual string_type
+ do_transform(const _CharT* __lo, const _CharT* __hi) const;
+ virtual long
+ do_hash(const _CharT* __lo, const _CharT* __hi) const;
+ };
+ template<typename _CharT>
+ locale::id collate<_CharT>::id;
+ template<>
+ int
+ collate<char>::_M_compare(const char*, const char*) const throw();
+ template<>
+ size_t
+ collate<char>::_M_transform(char*, const char*, size_t) const throw();
+ template<>
+ int
+ collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const throw();
+ template<>
+ size_t
+ collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const throw();
+ template<typename _CharT>
+ class collate_byname : public collate<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ collate_byname(const char* __s, size_t __refs = 0)
+ : collate<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ this->_S_destroy_c_locale(this->_M_c_locale_collate);
+ this->_S_create_c_locale(this->_M_c_locale_collate, __s);
+ }
+ }
+ protected:
+ virtual
+ ~collate_byname() { }
+ };
+}
+
+namespace std {
+ template<typename _Facet>
+ locale::
+ locale(const locale& __other, _Facet* __f)
+ {
+ _M_impl = new _Impl(*__other._M_impl, 1);
+ try
+ { _M_impl->_M_install_facet(&_Facet::id, __f); }
+ catch(...)
+ {
+ _M_impl->_M_remove_reference();
+ throw;
+ }
+ delete [] _M_impl->_M_names[0];
+ _M_impl->_M_names[0] = 0;
+ }
+ template<typename _Facet>
+ locale
+ locale::
+ combine(const locale& __other) const
+ {
+ _Impl* __tmp = new _Impl(*_M_impl, 1);
+ try
+ {
+ __tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
+ }
+ catch(...)
+ {
+ __tmp->_M_remove_reference();
+ throw;
+ }
+ return locale(__tmp);
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ bool
+ locale::
+ operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
+ const basic_string<_CharT, _Traits, _Alloc>& __s2) const
+ {
+ typedef std::collate<_CharT> __collate_type;
+ const __collate_type& __collate = use_facet<__collate_type>(*this);
+ return (__collate.compare(__s1.data(), __s1.data() + __s1.length(),
+ __s2.data(), __s2.data() + __s2.length()) < 0);
+ }
+ template<typename _Facet>
+ bool
+ has_facet(const locale& __loc) throw()
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ return (__i < __loc._M_impl->_M_facets_size
+ && dynamic_cast<const _Facet*>(__facets[__i]));
+ }
+ template<typename _Facet>
+ const _Facet&
+ use_facet(const locale& __loc)
+ {
+ const size_t __i = _Facet::id._M_id();
+ const locale::facet** __facets = __loc._M_impl->_M_facets;
+ if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
+ __throw_bad_cast();
+ return dynamic_cast<const _Facet&>(*__facets[__i]);
+ }
+ template<typename _CharT>
+ int
+ collate<_CharT>::_M_compare(const _CharT*, const _CharT*) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ size_t
+ collate<_CharT>::_M_transform(_CharT*, const _CharT*, size_t) const throw ()
+ { return 0; }
+ template<typename _CharT>
+ int
+ collate<_CharT>::
+ do_compare(const _CharT* __lo1, const _CharT* __hi1,
+ const _CharT* __lo2, const _CharT* __hi2) const
+ {
+ const string_type __one(__lo1, __hi1);
+ const string_type __two(__lo2, __hi2);
+ const _CharT* __p = __one.c_str();
+ const _CharT* __pend = __one.data() + __one.length();
+ const _CharT* __q = __two.c_str();
+ const _CharT* __qend = __two.data() + __two.length();
+ for (;;)
+ {
+ const int __res = _M_compare(__p, __q);
+ if (__res)
+ return __res;
+ __p += char_traits<_CharT>::length(__p);
+ __q += char_traits<_CharT>::length(__q);
+ if (__p == __pend && __q == __qend)
+ return 0;
+ else if (__p == __pend)
+ return -1;
+ else if (__q == __qend)
+ return 1;
+ __p++;
+ __q++;
+ }
+ }
+ template<typename _CharT>
+ typename collate<_CharT>::string_type
+ collate<_CharT>::
+ do_transform(const _CharT* __lo, const _CharT* __hi) const
+ {
+ string_type __ret;
+ const string_type __str(__lo, __hi);
+ const _CharT* __p = __str.c_str();
+ const _CharT* __pend = __str.data() + __str.length();
+ size_t __len = (__hi - __lo) * 2;
+ _CharT* __c = new _CharT[__len];
+ try
+ {
+ for (;;)
+ {
+ size_t __res = _M_transform(__c, __p, __len);
+ if (__res >= __len)
+ {
+ __len = __res + 1;
+ delete [] __c, __c = 0;
+ __c = new _CharT[__len];
+ __res = _M_transform(__c, __p, __len);
+ }
+ __ret.append(__c, __res);
+ __p += char_traits<_CharT>::length(__p);
+ if (__p == __pend)
+ break;
+ __p++;
+ __ret.push_back(_CharT());
+ }
+ }
+ catch(...)
+ {
+ delete [] __c;
+ throw;
+ }
+ delete [] __c;
+ return __ret;
+ }
+ template<typename _CharT>
+ long
+ collate<_CharT>::
+ do_hash(const _CharT* __lo, const _CharT* __hi) const
+ {
+ unsigned long __val = 0;
+ for (; __lo < __hi; ++__lo)
+ __val =
+ *__lo + ((__val << 7)
+ | (__val >> (__gnu_cxx::__numeric_traits<unsigned long>::
+ __digits - 7)));
+ return static_cast<long>(__val);
+ }
+ extern template class collate<char>;
+ extern template class collate_byname<char>;
+ extern template
+ const collate<char>&
+ use_facet<collate<char> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<char> >(const locale&);
+ extern template class collate<wchar_t>;
+ extern template class collate_byname<wchar_t>;
+ extern template
+ const collate<wchar_t>&
+ use_facet<collate<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<collate<wchar_t> >(const locale&);
+}
+namespace std {
+ enum _Ios_Fmtflags
+ {
+ _S_boolalpha = 1L << 0,
+ _S_dec = 1L << 1,
+ _S_fixed = 1L << 2,
+ _S_hex = 1L << 3,
+ _S_internal = 1L << 4,
+ _S_left = 1L << 5,
+ _S_oct = 1L << 6,
+ _S_right = 1L << 7,
+ _S_scientific = 1L << 8,
+ _S_showbase = 1L << 9,
+ _S_showpoint = 1L << 10,
+ _S_showpos = 1L << 11,
+ _S_skipws = 1L << 12,
+ _S_unitbuf = 1L << 13,
+ _S_uppercase = 1L << 14,
+ _S_adjustfield = _S_left | _S_right | _S_internal,
+ _S_basefield = _S_dec | _S_oct | _S_hex,
+ _S_floatfield = _S_scientific | _S_fixed,
+ _S_ios_fmtflags_end = 1L << 16
+ };
+ inline _Ios_Fmtflags
+ operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Fmtflags
+ operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
+ { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Fmtflags&
+ operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a | __b; }
+ inline _Ios_Fmtflags&
+ operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a & __b; }
+ inline _Ios_Fmtflags&
+ operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Fmtflags
+ operator~(_Ios_Fmtflags __a)
+ { return _Ios_Fmtflags(~static_cast<int>(__a)); }
+ enum _Ios_Openmode
+ {
+ _S_app = 1L << 0,
+ _S_ate = 1L << 1,
+ _S_bin = 1L << 2,
+ _S_in = 1L << 3,
+ _S_out = 1L << 4,
+ _S_trunc = 1L << 5,
+ _S_ios_openmode_end = 1L << 16
+ };
+ inline _Ios_Openmode
+ operator&(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator|(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Openmode
+ operator^(_Ios_Openmode __a, _Ios_Openmode __b)
+ { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Openmode&
+ operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a | __b; }
+ inline _Ios_Openmode&
+ operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a & __b; }
+ inline _Ios_Openmode&
+ operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Openmode
+ operator~(_Ios_Openmode __a)
+ { return _Ios_Openmode(~static_cast<int>(__a)); }
+ enum _Ios_Iostate
+ {
+ _S_goodbit = 0,
+ _S_badbit = 1L << 0,
+ _S_eofbit = 1L << 1,
+ _S_failbit = 1L << 2,
+ _S_ios_iostate_end = 1L << 16
+ };
+ inline _Ios_Iostate
+ operator&(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator|(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
+ inline _Ios_Iostate
+ operator^(_Ios_Iostate __a, _Ios_Iostate __b)
+ { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
+ inline _Ios_Iostate&
+ operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a | __b; }
+ inline _Ios_Iostate&
+ operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a & __b; }
+ inline _Ios_Iostate&
+ operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
+ { return __a = __a ^ __b; }
+ inline _Ios_Iostate
+ operator~(_Ios_Iostate __a)
+ { return _Ios_Iostate(~static_cast<int>(__a)); }
+ enum _Ios_Seekdir
+ {
+ _S_beg = 0,
+ _S_cur = 1,
+ _S_end = 2,
+ _S_ios_seekdir_end = 1L << 16
+ };
+ class ios_base
+ {
+ public:
+ class failure : public exception
+ {
+ public:
+ explicit
+ failure(const string& __str) throw();
+ virtual
+ ~failure() throw();
+ virtual const char*
+ what() const throw();
+ private:
+ string _M_msg;
+ };
+ typedef _Ios_Fmtflags fmtflags;
+ static const fmtflags boolalpha = _S_boolalpha;
+ static const fmtflags dec = _S_dec;
+ static const fmtflags fixed = _S_fixed;
+ static const fmtflags hex = _S_hex;
+ static const fmtflags internal = _S_internal;
+ static const fmtflags left = _S_left;
+ static const fmtflags oct = _S_oct;
+ static const fmtflags right = _S_right;
+ static const fmtflags scientific = _S_scientific;
+ static const fmtflags showbase = _S_showbase;
+ static const fmtflags showpoint = _S_showpoint;
+ static const fmtflags showpos = _S_showpos;
+ static const fmtflags skipws = _S_skipws;
+ static const fmtflags unitbuf = _S_unitbuf;
+ static const fmtflags uppercase = _S_uppercase;
+ static const fmtflags adjustfield = _S_adjustfield;
+ static const fmtflags basefield = _S_basefield;
+ static const fmtflags floatfield = _S_floatfield;
+ typedef _Ios_Iostate iostate;
+ static const iostate badbit = _S_badbit;
+ static const iostate eofbit = _S_eofbit;
+ static const iostate failbit = _S_failbit;
+ static const iostate goodbit = _S_goodbit;
+ typedef _Ios_Openmode openmode;
+ static const openmode app = _S_app;
+ static const openmode ate = _S_ate;
+ static const openmode binary = _S_bin;
+ static const openmode in = _S_in;
+ static const openmode out = _S_out;
+ static const openmode trunc = _S_trunc;
+ typedef _Ios_Seekdir seekdir;
+ static const seekdir beg = _S_beg;
+ static const seekdir cur = _S_cur;
+ static const seekdir end = _S_end;
+ typedef int io_state;
+ typedef int open_mode;
+ typedef int seek_dir;
+ typedef std::streampos streampos;
+ typedef std::streamoff streamoff;
+ enum event
+ {
+ erase_event,
+ imbue_event,
+ copyfmt_event
+ };
+ typedef void (*event_callback) (event, ios_base&, int);
+ void
+ register_callback(event_callback __fn, int __index);
+ protected:
+ streamsize _M_precision;
+ streamsize _M_width;
+ fmtflags _M_flags;
+ iostate _M_exception;
+ iostate _M_streambuf_state;
+ struct _Callback_list
+ {
+ _Callback_list* _M_next;
+ ios_base::event_callback _M_fn;
+ int _M_index;
+ _Atomic_word _M_refcount;
+ _Callback_list(ios_base::event_callback __fn, int __index,
+ _Callback_list* __cb)
+ : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
+ void
+ _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
+ int
+ _M_remove_reference()
+ { return __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); }
+ };
+ _Callback_list* _M_callbacks;
+ void
+ _M_call_callbacks(event __ev) throw();
+ void
+ _M_dispose_callbacks(void) throw();
+ struct _Words
+ {
+ void* _M_pword;
+ long _M_iword;
+ _Words() : _M_pword(0), _M_iword(0) { }
+ };
+ _Words _M_word_zero;
+ enum { _S_local_word_size = 8 };
+ _Words _M_local_word[_S_local_word_size];
+ int _M_word_size;
+ _Words* _M_word;
+ _Words&
+ _M_grow_words(int __index, bool __iword);
+ locale _M_ios_locale;
+ void
+ _M_init() throw();
+ public:
+ class Init
+ {
+ friend class ios_base;
+ public:
+ Init();
+ ~Init();
+ private:
+ static _Atomic_word _S_refcount;
+ static bool _S_synced_with_stdio;
+ };
+ fmtflags
+ flags() const
+ { return _M_flags; }
+ fmtflags
+ flags(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags = __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags |= __fmtfl;
+ return __old;
+ }
+ fmtflags
+ setf(fmtflags __fmtfl, fmtflags __mask)
+ {
+ fmtflags __old = _M_flags;
+ _M_flags &= ~__mask;
+ _M_flags |= (__fmtfl & __mask);
+ return __old;
+ }
+ void
+ unsetf(fmtflags __mask)
+ { _M_flags &= ~__mask; }
+ streamsize
+ precision() const
+ { return _M_precision; }
+ streamsize
+ precision(streamsize __prec)
+ {
+ streamsize __old = _M_precision;
+ _M_precision = __prec;
+ return __old;
+ }
+ streamsize
+ width() const
+ { return _M_width; }
+ streamsize
+ width(streamsize __wide)
+ {
+ streamsize __old = _M_width;
+ _M_width = __wide;
+ return __old;
+ }
+ static bool
+ sync_with_stdio(bool __sync = true);
+ locale
+ imbue(const locale& __loc) throw();
+ locale
+ getloc() const
+ { return _M_ios_locale; }
+ const locale&
+ _M_getloc() const
+ { return _M_ios_locale; }
+ static int
+ xalloc() throw();
+ long&
+ iword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, true);
+ return __word._M_iword;
+ }
+ void*&
+ pword(int __ix)
+ {
+ _Words& __word = (__ix < _M_word_size)
+ ? _M_word[__ix] : _M_grow_words(__ix, false);
+ return __word._M_pword;
+ }
+ virtual ~ios_base();
+ protected:
+ ios_base() throw ();
+ private:
+ ios_base(const ios_base&);
+ ios_base&
+ operator=(const ios_base&);
+ };
+ inline ios_base&
+ boolalpha(ios_base& __base)
+ {
+ __base.setf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ noboolalpha(ios_base& __base)
+ {
+ __base.unsetf(ios_base::boolalpha);
+ return __base;
+ }
+ inline ios_base&
+ showbase(ios_base& __base)
+ {
+ __base.setf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ noshowbase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showbase);
+ return __base;
+ }
+ inline ios_base&
+ showpoint(ios_base& __base)
+ {
+ __base.setf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ noshowpoint(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpoint);
+ return __base;
+ }
+ inline ios_base&
+ showpos(ios_base& __base)
+ {
+ __base.setf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ noshowpos(ios_base& __base)
+ {
+ __base.unsetf(ios_base::showpos);
+ return __base;
+ }
+ inline ios_base&
+ skipws(ios_base& __base)
+ {
+ __base.setf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ noskipws(ios_base& __base)
+ {
+ __base.unsetf(ios_base::skipws);
+ return __base;
+ }
+ inline ios_base&
+ uppercase(ios_base& __base)
+ {
+ __base.setf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ nouppercase(ios_base& __base)
+ {
+ __base.unsetf(ios_base::uppercase);
+ return __base;
+ }
+ inline ios_base&
+ unitbuf(ios_base& __base)
+ {
+ __base.setf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ nounitbuf(ios_base& __base)
+ {
+ __base.unsetf(ios_base::unitbuf);
+ return __base;
+ }
+ inline ios_base&
+ internal(ios_base& __base)
+ {
+ __base.setf(ios_base::internal, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ left(ios_base& __base)
+ {
+ __base.setf(ios_base::left, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ right(ios_base& __base)
+ {
+ __base.setf(ios_base::right, ios_base::adjustfield);
+ return __base;
+ }
+ inline ios_base&
+ dec(ios_base& __base)
+ {
+ __base.setf(ios_base::dec, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ hex(ios_base& __base)
+ {
+ __base.setf(ios_base::hex, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ oct(ios_base& __base)
+ {
+ __base.setf(ios_base::oct, ios_base::basefield);
+ return __base;
+ }
+ inline ios_base&
+ fixed(ios_base& __base)
+ {
+ __base.setf(ios_base::fixed, ios_base::floatfield);
+ return __base;
+ }
+ inline ios_base&
+ scientific(ios_base& __base)
+ {
+ __base.setf(ios_base::scientific, ios_base::floatfield);
+ return __base;
+ }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
+ basic_streambuf<_CharT, _Traits>*, bool&);
+ template<typename _CharT, typename _Traits>
+ class basic_streambuf
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename traits_type::int_type int_type;
+ typedef typename traits_type::pos_type pos_type;
+ typedef typename traits_type::off_type off_type;
+ typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ friend class basic_ios<char_type, traits_type>;
+ friend class basic_istream<char_type, traits_type>;
+ friend class basic_ostream<char_type, traits_type>;
+ friend class istreambuf_iterator<char_type, traits_type>;
+ friend class ostreambuf_iterator<char_type, traits_type>;
+ friend streamsize
+ __copy_streambufs_eof<>(__streambuf_type*, __streambuf_type*, bool&);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ template<typename _CharT2, typename _Traits2>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ operator>>(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&);
+ template<typename _CharT2, typename _Traits2, typename _Alloc>
+ friend basic_istream<_CharT2, _Traits2>&
+ getline(basic_istream<_CharT2, _Traits2>&,
+ basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);
+ protected:
+ char_type* _M_in_beg;
+ char_type* _M_in_cur;
+ char_type* _M_in_end;
+ char_type* _M_out_beg;
+ char_type* _M_out_cur;
+ char_type* _M_out_end;
+ locale _M_buf_locale;
+ public:
+ virtual
+ ~basic_streambuf()
+ { }
+ locale
+ pubimbue(const locale &__loc)
+ {
+ locale __tmp(this->getloc());
+ this->imbue(__loc);
+ _M_buf_locale = __loc;
+ return __tmp;
+ }
+ locale
+ getloc() const
+ { return _M_buf_locale; }
+ __streambuf_type*
+ pubsetbuf(char_type* __s, streamsize __n)
+ { return this->setbuf(__s, __n); }
+ pos_type
+ pubseekoff(off_type __off, ios_base::seekdir __way,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekoff(__off, __way, __mode); }
+ pos_type
+ pubseekpos(pos_type __sp,
+ ios_base::openmode __mode = ios_base::in | ios_base::out)
+ { return this->seekpos(__sp, __mode); }
+ int
+ pubsync() { return this->sync(); }
+ streamsize
+ in_avail()
+ {
+ const streamsize __ret = this->egptr() - this->gptr();
+ return __ret ? __ret : this->showmanyc();
+ }
+ int_type
+ snextc()
+ {
+ int_type __ret = traits_type::eof();
+ if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
+ __ret), true))
+ __ret = this->sgetc();
+ return __ret;
+ }
+ int_type
+ sbumpc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ else
+ __ret = this->uflow();
+ return __ret;
+ }
+ int_type
+ sgetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->gptr() < this->egptr(), true))
+ __ret = traits_type::to_int_type(*this->gptr());
+ else
+ __ret = this->underflow();
+ return __ret;
+ }
+ streamsize
+ sgetn(char_type* __s, streamsize __n)
+ { return this->xsgetn(__s, __n); }
+ int_type
+ sputbackc(char_type __c)
+ {
+ int_type __ret;
+ const bool __testpos = this->eback() < this->gptr();
+ if (__builtin_expect(!__testpos ||
+ !traits_type::eq(__c, this->gptr()[-1]), false))
+ __ret = this->pbackfail(traits_type::to_int_type(__c));
+ else
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ return __ret;
+ }
+ int_type
+ sungetc()
+ {
+ int_type __ret;
+ if (__builtin_expect(this->eback() < this->gptr(), true))
+ {
+ this->gbump(-1);
+ __ret = traits_type::to_int_type(*this->gptr());
+ }
+ else
+ __ret = this->pbackfail();
+ return __ret;
+ }
+ int_type
+ sputc(char_type __c)
+ {
+ int_type __ret;
+ if (__builtin_expect(this->pptr() < this->epptr(), true))
+ {
+ *this->pptr() = __c;
+ this->pbump(1);
+ __ret = traits_type::to_int_type(__c);
+ }
+ else
+ __ret = this->overflow(traits_type::to_int_type(__c));
+ return __ret;
+ }
+ streamsize
+ sputn(const char_type* __s, streamsize __n)
+ { return this->xsputn(__s, __n); }
+ protected:
+ basic_streambuf()
+ : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
+ _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
+ _M_buf_locale(locale())
+ { }
+ char_type*
+ eback() const { return _M_in_beg; }
+ char_type*
+ gptr() const { return _M_in_cur; }
+ char_type*
+ egptr() const { return _M_in_end; }
+ void
+ gbump(int __n) { _M_in_cur += __n; }
+ void
+ setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
+ {
+ _M_in_beg = __gbeg;
+ _M_in_cur = __gnext;
+ _M_in_end = __gend;
+ }
+ char_type*
+ pbase() const { return _M_out_beg; }
+ char_type*
+ pptr() const { return _M_out_cur; }
+ char_type*
+ epptr() const { return _M_out_end; }
+ void
+ pbump(int __n) { _M_out_cur += __n; }
+ void
+ setp(char_type* __pbeg, char_type* __pend)
+ {
+ _M_out_beg = _M_out_cur = __pbeg;
+ _M_out_end = __pend;
+ }
+ virtual void
+ imbue(const locale&)
+ { }
+ virtual basic_streambuf<char_type,_Traits>*
+ setbuf(char_type*, streamsize)
+ { return this; }
+ virtual pos_type
+ seekoff(off_type, ios_base::seekdir,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual pos_type
+ seekpos(pos_type,
+ ios_base::openmode = ios_base::in | ios_base::out)
+ { return pos_type(off_type(-1)); }
+ virtual int
+ sync() { return 0; }
+ virtual streamsize
+ showmanyc() { return 0; }
+ virtual streamsize
+ xsgetn(char_type* __s, streamsize __n);
+ virtual int_type
+ underflow()
+ { return traits_type::eof(); }
+ virtual int_type
+ uflow()
+ {
+ int_type __ret = traits_type::eof();
+ const bool __testeof = traits_type::eq_int_type(this->underflow(),
+ __ret);
+ if (!__testeof)
+ {
+ __ret = traits_type::to_int_type(*this->gptr());
+ this->gbump(1);
+ }
+ return __ret;
+ }
+ virtual int_type
+ pbackfail(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ virtual streamsize
+ xsputn(const char_type* __s, streamsize __n);
+ virtual int_type
+ overflow(int_type = traits_type::eof())
+ { return traits_type::eof(); }
+ public:
+ void
+ stossc()
+ {
+ if (this->gptr() < this->egptr())
+ this->gbump(1);
+ else
+ this->uflow();
+ }
+ private:
+ basic_streambuf(const __streambuf_type& __sb)
+ : _M_in_beg(__sb._M_in_beg), _M_in_cur(__sb._M_in_cur),
+ _M_in_end(__sb._M_in_end), _M_out_beg(__sb._M_out_beg),
+ _M_out_cur(__sb._M_out_cur), _M_out_end(__sb._M_out_cur),
+ _M_buf_locale(__sb._M_buf_locale)
+ { }
+ __streambuf_type&
+ operator=(const __streambuf_type&) { return *this; };
+ };
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>* __sbin,
+ basic_streambuf<char>* __sbout, bool& __ineof);
+ template<>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
+ basic_streambuf<wchar_t>* __sbout, bool& __ineof);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsgetn(char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->egptr() - this->gptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(__s, this->gptr(), __len);
+ __ret += __len;
+ __s += __len;
+ this->gbump(__len);
+ }
+ if (__ret < __n)
+ {
+ const int_type __c = this->uflow();
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ traits_type::assign(*__s++, traits_type::to_char_type(__c));
+ ++__ret;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_streambuf<_CharT, _Traits>::
+ xsputn(const char_type* __s, streamsize __n)
+ {
+ streamsize __ret = 0;
+ while (__ret < __n)
+ {
+ const streamsize __buf_len = this->epptr() - this->pptr();
+ if (__buf_len)
+ {
+ const streamsize __remaining = __n - __ret;
+ const streamsize __len = std::min(__buf_len, __remaining);
+ traits_type::copy(this->pptr(), __s, __len);
+ __ret += __len;
+ __s += __len;
+ this->pbump(__len);
+ }
+ if (__ret < __n)
+ {
+ int_type __c = this->overflow(traits_type::to_int_type(*__s));
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ ++__ret;
+ ++__s;
+ }
+ else
+ break;
+ }
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout,
+ bool& __ineof)
+ {
+ streamsize __ret = 0;
+ __ineof = true;
+ typename _Traits::int_type __c = __sbin->sgetc();
+ while (!_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __c = __sbout->sputc(_Traits::to_char_type(__c));
+ if (_Traits::eq_int_type(__c, _Traits::eof()))
+ {
+ __ineof = false;
+ break;
+ }
+ ++__ret;
+ __c = __sbin->snextc();
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ inline streamsize
+ __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,
+ basic_streambuf<_CharT, _Traits>* __sbout)
+ {
+ bool __ineof;
+ return __copy_streambufs_eof(__sbin, __sbout, __ineof);
+ }
+ extern template class basic_streambuf<char>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<char>*,
+ basic_streambuf<char>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<char>*,
+ basic_streambuf<char>*, bool&);
+ extern template class basic_streambuf<wchar_t>;
+ extern template
+ streamsize
+ __copy_streambufs(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*);
+ extern template
+ streamsize
+ __copy_streambufs_eof(basic_streambuf<wchar_t>*,
+ basic_streambuf<wchar_t>*, bool&);
+}
+
+
+
+extern "C" {
+typedef int wctype_t;
+typedef int wctrans_t;
+int __attribute__((__cdecl__)) iswalpha (wint_t);
+int __attribute__((__cdecl__)) iswalnum (wint_t);
+int __attribute__((__cdecl__)) iswblank (wint_t);
+int __attribute__((__cdecl__)) iswcntrl (wint_t);
+int __attribute__((__cdecl__)) iswctype (wint_t, wctype_t);
+int __attribute__((__cdecl__)) iswdigit (wint_t);
+int __attribute__((__cdecl__)) iswgraph (wint_t);
+int __attribute__((__cdecl__)) iswlower (wint_t);
+int __attribute__((__cdecl__)) iswprint (wint_t);
+int __attribute__((__cdecl__)) iswpunct (wint_t);
+int __attribute__((__cdecl__)) iswspace (wint_t);
+int __attribute__((__cdecl__)) iswupper (wint_t);
+int __attribute__((__cdecl__)) iswxdigit (wint_t);
+wint_t __attribute__((__cdecl__)) towctrans (wint_t, wctrans_t);
+wint_t __attribute__((__cdecl__)) towupper (wint_t);
+wint_t __attribute__((__cdecl__)) towlower (wint_t);
+wctrans_t __attribute__((__cdecl__)) wctrans (const char *);
+wctype_t __attribute__((__cdecl__)) wctype (const char *);
+}
+namespace std {
+ using ::wctrans_t;
+ using ::wctype_t;
+ using ::wint_t;
+ using ::iswalnum;
+ using ::iswalpha;
+ using ::iswblank;
+ using ::iswcntrl;
+ using ::iswctype;
+ using ::iswdigit;
+ using ::iswgraph;
+ using ::iswlower;
+ using ::iswprint;
+ using ::iswpunct;
+ using ::iswspace;
+ using ::iswupper;
+ using ::iswxdigit;
+ using ::towctrans;
+ using ::towlower;
+ using ::towupper;
+ using ::wctrans;
+ using ::wctype;
+}
+
+namespace std {
+ struct ctype_base
+ {
+ typedef const int* __to_type;
+ typedef char mask;
+ static const mask upper = 01;
+ static const mask lower = 02;
+ static const mask alpha = 01 | 02;
+ static const mask digit = 04;
+ static const mask xdigit = 0100 | 04;
+ static const mask space = 010;
+ static const mask print = 020 | 01 | 02 | 04 | 0200;
+ static const mask graph = 020 | 01 | 02 | 04;
+ static const mask cntrl = 040;
+ static const mask punct = 020;
+ static const mask alnum = 01 | 02 | 04;
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator
+ : public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
+ _CharT*, _CharT&>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename _Traits::int_type int_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_istream<_CharT, _Traits> istream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ template<bool _IsMove, typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ _CharT2*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT2>,
+ istreambuf_iterator<_CharT2>, _CharT2*);
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ private:
+ mutable streambuf_type* _M_sbuf;
+ mutable int_type _M_c;
+ public:
+ istreambuf_iterator() throw()
+ : _M_sbuf(0), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(istream_type& __s) throw()
+ : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
+ istreambuf_iterator(streambuf_type* __s) throw()
+ : _M_sbuf(__s), _M_c(traits_type::eof()) { }
+ char_type
+ operator*() const
+ {
+ return traits_type::to_char_type(_M_get());
+ }
+ istreambuf_iterator&
+ operator++()
+ {
+ ;
+ if (_M_sbuf)
+ {
+ _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return *this;
+ }
+ istreambuf_iterator
+ operator++(int)
+ {
+ ;
+ istreambuf_iterator __old = *this;
+ if (_M_sbuf)
+ {
+ __old._M_c = _M_sbuf->sbumpc();
+ _M_c = traits_type::eof();
+ }
+ return __old;
+ }
+ bool
+ equal(const istreambuf_iterator& __b) const
+ { return _M_at_eof() == __b._M_at_eof(); }
+ private:
+ int_type
+ _M_get() const
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __ret = __eof;
+ if (_M_sbuf)
+ {
+ if (!traits_type::eq_int_type(_M_c, __eof))
+ __ret = _M_c;
+ else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()),
+ __eof))
+ _M_c = __ret;
+ else
+ _M_sbuf = 0;
+ }
+ return __ret;
+ }
+ bool
+ _M_at_eof() const
+ {
+ const int_type __eof = traits_type::eof();
+ return traits_type::eq_int_type(_M_get(), __eof);
+ }
+ };
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return __a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ inline bool
+ operator!=(const istreambuf_iterator<_CharT, _Traits>& __a,
+ const istreambuf_iterator<_CharT, _Traits>& __b)
+ { return !__a.equal(__b); }
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ ostreambuf_iterator<_CharT2> >::__type
+ copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ ostreambuf_iterator<_CharT2>);
+ private:
+ streambuf_type* _M_sbuf;
+ bool _M_failed;
+ public:
+ ostreambuf_iterator(ostream_type& __s) throw ()
+ : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator(streambuf_type* __s) throw ()
+ : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
+ ostreambuf_iterator&
+ operator=(_CharT __c)
+ {
+ if (!_M_failed &&
+ _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
+ _M_failed = true;
+ return *this;
+ }
+ ostreambuf_iterator&
+ operator*()
+ { return *this; }
+ ostreambuf_iterator&
+ operator++(int)
+ { return *this; }
+ ostreambuf_iterator&
+ operator++()
+ { return *this; }
+ bool
+ failed() const throw()
+ { return _M_failed; }
+ ostreambuf_iterator&
+ _M_put(const _CharT* __ws, streamsize __len)
+ {
+ if (__builtin_expect(!_M_failed, true)
+ && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len,
+ false))
+ _M_failed = true;
+ return *this;
+ }
+ };
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ copy(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed)
+ {
+ bool __ineof;
+ __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof);
+ if (!__ineof)
+ __result._M_failed = true;
+ }
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(_CharT* __first, _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT> >::__type
+ __copy_move_a2(const _CharT* __first, const _CharT* __last,
+ ostreambuf_iterator<_CharT> __result)
+ {
+ const streamsize __num = __last - __first;
+ if (__num > 0)
+ __result._M_put(__first, __num);
+ return __result;
+ }
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, _CharT* __result)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof()))
+ {
+ const streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ traits_type::copy(__result, __sb->gptr(), __n);
+ __sb->gbump(__n);
+ __result += __n;
+ __c = __sb->underflow();
+ }
+ else
+ {
+ *__result++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ }
+ }
+ }
+ return __result;
+ }
+ template<typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ istreambuf_iterator<_CharT> >::__type
+ find(istreambuf_iterator<_CharT> __first,
+ istreambuf_iterator<_CharT> __last, const _CharT& __val)
+ {
+ typedef istreambuf_iterator<_CharT> __is_iterator_type;
+ typedef typename __is_iterator_type::traits_type traits_type;
+ typedef typename __is_iterator_type::streambuf_type streambuf_type;
+ typedef typename traits_type::int_type int_type;
+ if (__first._M_sbuf && !__last._M_sbuf)
+ {
+ const int_type __ival = traits_type::to_int_type(__val);
+ streambuf_type* __sb = __first._M_sbuf;
+ int_type __c = __sb->sgetc();
+ while (!traits_type::eq_int_type(__c, traits_type::eof())
+ && !traits_type::eq_int_type(__c, __ival))
+ {
+ streamsize __n = __sb->egptr() - __sb->gptr();
+ if (__n > 1)
+ {
+ const _CharT* __p = traits_type::find(__sb->gptr(),
+ __n, __val);
+ if (__p)
+ __n = __p - __sb->gptr();
+ __sb->gbump(__n);
+ __c = __sb->sgetc();
+ }
+ else
+ __c = __sb->snextc();
+ }
+ if (!traits_type::eq_int_type(__c, traits_type::eof()))
+ __first._M_c = __c;
+ else
+ __first._M_sbuf = 0;
+ }
+ return __first;
+ }
+}
+namespace std {
+ template<typename _Tp>
+ void
+ __convert_to_v(const char*, _Tp&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, float&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<>
+ void
+ __convert_to_v(const char*, long double&, ios_base::iostate&,
+ const __c_locale&) throw();
+ template<typename _CharT, typename _Traits>
+ struct __pad
+ {
+ static void
+ _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
+ const _CharT* __olds, streamsize __newlen, streamsize __oldlen);
+ };
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last);
+ template<typename _CharT>
+ inline
+ ostreambuf_iterator<_CharT>
+ __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
+ {
+ __s._M_put(__ws, __len);
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ inline
+ _OutIter
+ __write(_OutIter __s, const _CharT* __ws, int __len)
+ {
+ for (int __j = 0; __j < __len; __j++, ++__s)
+ *__s = __ws[__j];
+ return __s;
+ }
+ template<typename _CharT>
+ class __ctype_abstract_base : public locale::facet, public ctype_base
+ {
+ public:
+ typedef _CharT char_type;
+ bool
+ is(mask __m, char_type __c) const
+ { return this->do_is(__m, __c); }
+ const char_type*
+ is(const char_type *__lo, const char_type *__hi, mask *__vec) const
+ { return this->do_is(__lo, __hi, __vec); }
+ const char_type*
+ scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_is(__m, __lo, __hi); }
+ const char_type*
+ scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+ { return this->do_scan_not(__m, __lo, __hi); }
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ { return this->do_widen(__c); }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ { return this->do_widen(__lo, __hi, __to); }
+ char
+ narrow(char_type __c, char __dfault) const
+ { return this->do_narrow(__c, __dfault); }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ { return this->do_narrow(__lo, __hi, __dfault, __to); }
+ protected:
+ explicit
+ __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
+ virtual
+ ~__ctype_abstract_base() { }
+ virtual bool
+ do_is(mask __m, char_type __c) const = 0;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi,
+ mask* __vec) const = 0;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const = 0;
+ virtual char_type
+ do_toupper(char_type) const = 0;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_tolower(char_type) const = 0;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const = 0;
+ virtual char_type
+ do_widen(char) const = 0;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi,
+ char_type* __dest) const = 0;
+ virtual char
+ do_narrow(char_type, char __dfault) const = 0;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const = 0;
+ };
+ template<typename _CharT>
+ class ctype : public __ctype_abstract_base<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename __ctype_abstract_base<_CharT>::mask mask;
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
+ protected:
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type __c) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type __c) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ };
+ template<typename _CharT>
+ locale::id ctype<_CharT>::id;
+ template<>
+ class ctype<char> : public locale::facet, public ctype_base
+ {
+ public:
+ typedef char char_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_del;
+ __to_type _M_toupper;
+ __to_type _M_tolower;
+ const mask* _M_table;
+ mutable char _M_widen_ok;
+ mutable char _M_widen[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow[1 + static_cast<unsigned char>(-1)];
+ mutable char _M_narrow_ok;
+ public:
+ static locale::id id;
+ static const size_t table_size = 1 + static_cast<unsigned char>(-1);
+ explicit
+ ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
+ size_t __refs = 0);
+ inline bool
+ is(mask __m, char __c) const;
+ inline const char*
+ is(const char* __lo, const char* __hi, mask* __vec) const;
+ inline const char*
+ scan_is(mask __m, const char* __lo, const char* __hi) const;
+ inline const char*
+ scan_not(mask __m, const char* __lo, const char* __hi) const;
+ char_type
+ toupper(char_type __c) const
+ { return this->do_toupper(__c); }
+ const char_type*
+ toupper(char_type *__lo, const char_type* __hi) const
+ { return this->do_toupper(__lo, __hi); }
+ char_type
+ tolower(char_type __c) const
+ { return this->do_tolower(__c); }
+ const char_type*
+ tolower(char_type* __lo, const char_type* __hi) const
+ { return this->do_tolower(__lo, __hi); }
+ char_type
+ widen(char __c) const
+ {
+ if (_M_widen_ok)
+ return _M_widen[static_cast<unsigned char>(__c)];
+ this->_M_widen_init();
+ return this->do_widen(__c);
+ }
+ const char*
+ widen(const char* __lo, const char* __hi, char_type* __to) const
+ {
+ if (_M_widen_ok == 1)
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_widen_ok)
+ _M_widen_init();
+ return this->do_widen(__lo, __hi, __to);
+ }
+ char
+ narrow(char_type __c, char __dfault) const
+ {
+ if (_M_narrow[static_cast<unsigned char>(__c)])
+ return _M_narrow[static_cast<unsigned char>(__c)];
+ const char __t = do_narrow(__c, __dfault);
+ if (__t != __dfault)
+ _M_narrow[static_cast<unsigned char>(__c)] = __t;
+ return __t;
+ }
+ const char_type*
+ narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char *__to) const
+ {
+ if (__builtin_expect(_M_narrow_ok == 1, true))
+ {
+ __builtin_memcpy(__to, __lo, __hi - __lo);
+ return __hi;
+ }
+ if (!_M_narrow_ok)
+ _M_narrow_init();
+ return this->do_narrow(__lo, __hi, __dfault, __to);
+ }
+ const mask*
+ table() const throw()
+ { return _M_table; }
+ static const mask*
+ classic_table() throw();
+ protected:
+ virtual
+ ~ctype();
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char __c) const
+ { return __c; }
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ virtual char
+ do_narrow(char_type __c, char) const
+ { return __c; }
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char, char* __dest) const
+ {
+ __builtin_memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+ private:
+ void _M_narrow_init() const;
+ void _M_widen_init() const;
+ };
+ template<>
+ class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
+ {
+ public:
+ typedef wchar_t char_type;
+ typedef wctype_t __wmask_type;
+ protected:
+ __c_locale _M_c_locale_ctype;
+ bool _M_narrow_ok;
+ char _M_narrow[128];
+ wint_t _M_widen[1 + static_cast<unsigned char>(-1)];
+ mask _M_bit[16];
+ __wmask_type _M_wmask[16];
+ public:
+ static locale::id id;
+ explicit
+ ctype(size_t __refs = 0);
+ explicit
+ ctype(__c_locale __cloc, size_t __refs = 0);
+ protected:
+ __wmask_type
+ _M_convert_to_wmask(const mask __m) const throw();
+ virtual
+ ~ctype();
+ virtual bool
+ do_is(mask __m, char_type __c) const;
+ virtual const char_type*
+ do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
+ virtual const char_type*
+ do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
+ virtual const char_type*
+ do_scan_not(mask __m, const char_type* __lo,
+ const char_type* __hi) const;
+ virtual char_type
+ do_toupper(char_type) const;
+ virtual const char_type*
+ do_toupper(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_tolower(char_type) const;
+ virtual const char_type*
+ do_tolower(char_type* __lo, const char_type* __hi) const;
+ virtual char_type
+ do_widen(char) const;
+ virtual const char*
+ do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
+ virtual char
+ do_narrow(char_type, char __dfault) const;
+ virtual const char_type*
+ do_narrow(const char_type* __lo, const char_type* __hi,
+ char __dfault, char* __dest) const;
+ void
+ _M_initialize_ctype() throw();
+ };
+ template<typename _CharT>
+ class ctype_byname : public ctype<_CharT>
+ {
+ public:
+ typedef typename ctype<_CharT>::mask mask;
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname() { };
+ };
+ template<>
+ class ctype_byname<char> : public ctype<char>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+ template<>
+ class ctype_byname<wchar_t> : public ctype<wchar_t>
+ {
+ public:
+ explicit
+ ctype_byname(const char* __s, size_t __refs = 0);
+ protected:
+ virtual
+ ~ctype_byname();
+ };
+}
+namespace std {
+ bool
+ ctype<char>::
+ is(mask __m, char __c) const
+ { return _M_table[static_cast<unsigned char>(__c)] & __m; }
+ const char*
+ ctype<char>::
+ is(const char* __low, const char* __high, mask* __vec) const
+ {
+ while (__low < __high)
+ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
+ return __high;
+ }
+ const char*
+ ctype<char>::
+ scan_is(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && !this->is(__m, *__low))
+ ++__low;
+ return __low;
+ }
+ const char*
+ ctype<char>::
+ scan_not(mask __m, const char* __low, const char* __high) const
+ {
+ while (__low < __high && this->is(__m, *__low) != 0)
+ ++__low;
+ return __low;
+ }
+}
+namespace std {
+ class __num_base
+ {
+ public:
+ enum
+ {
+ _S_ominus,
+ _S_oplus,
+ _S_ox,
+ _S_oX,
+ _S_odigits,
+ _S_odigits_end = _S_odigits + 16,
+ _S_oudigits = _S_odigits_end,
+ _S_oudigits_end = _S_oudigits + 16,
+ _S_oe = _S_odigits + 14,
+ _S_oE = _S_oudigits + 14,
+ _S_oend = _S_oudigits_end
+ };
+ static const char* _S_atoms_out;
+ static const char* _S_atoms_in;
+ enum
+ {
+ _S_iminus,
+ _S_iplus,
+ _S_ix,
+ _S_iX,
+ _S_izero,
+ _S_ie = _S_izero + 14,
+ _S_iE = _S_izero + 20,
+ _S_iend = 26
+ };
+ static void
+ _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw();
+ };
+ template<typename _CharT>
+ struct __numpunct_cache : public locale::facet
+ {
+ const char* _M_grouping;
+ size_t _M_grouping_size;
+ bool _M_use_grouping;
+ const _CharT* _M_truename;
+ size_t _M_truename_size;
+ const _CharT* _M_falsename;
+ size_t _M_falsename_size;
+ _CharT _M_decimal_point;
+ _CharT _M_thousands_sep;
+ _CharT _M_atoms_out[__num_base::_S_oend];
+ _CharT _M_atoms_in[__num_base::_S_iend];
+ bool _M_allocated;
+ __numpunct_cache(size_t __refs = 0) : facet(__refs),
+ _M_grouping(__null), _M_grouping_size(0), _M_use_grouping(false),
+ _M_truename(__null), _M_truename_size(0), _M_falsename(__null),
+ _M_falsename_size(0), _M_decimal_point(_CharT()),
+ _M_thousands_sep(_CharT()), _M_allocated(false)
+ { }
+ ~__numpunct_cache();
+ void
+ _M_cache(const locale& __loc);
+ private:
+ __numpunct_cache&
+ operator=(const __numpunct_cache&);
+ explicit
+ __numpunct_cache(const __numpunct_cache&);
+ };
+ template<typename _CharT>
+ __numpunct_cache<_CharT>::~__numpunct_cache()
+ {
+ if (_M_allocated)
+ {
+ delete [] _M_grouping;
+ delete [] _M_truename;
+ delete [] _M_falsename;
+ }
+ }
+ template<typename _CharT>
+ class numpunct : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ protected:
+ __cache_type* _M_data;
+ public:
+ static locale::id id;
+ explicit
+ numpunct(size_t __refs = 0) : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__cache_type* __cache, size_t __refs = 0)
+ : facet(__refs), _M_data(__cache)
+ { _M_initialize_numpunct(); }
+ explicit
+ numpunct(__c_locale __cloc, size_t __refs = 0)
+ : facet(__refs), _M_data(__null)
+ { _M_initialize_numpunct(__cloc); }
+ char_type
+ decimal_point() const
+ { return this->do_decimal_point(); }
+ char_type
+ thousands_sep() const
+ { return this->do_thousands_sep(); }
+ string
+ grouping() const
+ { return this->do_grouping(); }
+ string_type
+ truename() const
+ { return this->do_truename(); }
+ string_type
+ falsename() const
+ { return this->do_falsename(); }
+ protected:
+ virtual
+ ~numpunct();
+ virtual char_type
+ do_decimal_point() const
+ { return _M_data->_M_decimal_point; }
+ virtual char_type
+ do_thousands_sep() const
+ { return _M_data->_M_thousands_sep; }
+ virtual string
+ do_grouping() const
+ { return _M_data->_M_grouping; }
+ virtual string_type
+ do_truename() const
+ { return _M_data->_M_truename; }
+ virtual string_type
+ do_falsename() const
+ { return _M_data->_M_falsename; }
+ void
+ _M_initialize_numpunct(__c_locale __cloc = __null);
+ };
+ template<typename _CharT>
+ locale::id numpunct<_CharT>::id;
+ template<>
+ numpunct<char>::~numpunct();
+ template<>
+ void
+ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
+ template<>
+ numpunct<wchar_t>::~numpunct();
+ template<>
+ void
+ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
+ template<typename _CharT>
+ class numpunct_byname : public numpunct<_CharT>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef basic_string<_CharT> string_type;
+ explicit
+ numpunct_byname(const char* __s, size_t __refs = 0)
+ : numpunct<_CharT>(__refs)
+ {
+ if (__builtin_strcmp(__s, "C") != 0
+ && __builtin_strcmp(__s, "POSIX") != 0)
+ {
+ __c_locale __tmp;
+ this->_S_create_c_locale(__tmp, __s);
+ this->_M_initialize_numpunct(__tmp);
+ this->_S_destroy_c_locale(__tmp);
+ }
+ }
+ protected:
+ virtual
+ ~numpunct_byname() { }
+ };
+
+ template<typename _CharT, typename _InIter>
+ class num_get : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _InIter iter_type;
+ static locale::id id;
+ explicit
+ num_get(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ iter_type
+ get(iter_type __in, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ { return this->do_get(__in, __end, __io, __err, __v); }
+ protected:
+ virtual ~num_get() { }
+ iter_type
+ _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ string&) const;
+ template<typename _ValueT>
+ iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ _ValueT&) const;
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
+ _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ if (__len <= 10)
+ {
+ if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
+ __ret = __c - _CharT2('0');
+ }
+ else
+ {
+ if (__c >= _CharT2('0') && __c <= _CharT2('9'))
+ __ret = __c - _CharT2('0');
+ else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
+ __ret = 10 + (__c - _CharT2('a'));
+ else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
+ __ret = 10 + (__c - _CharT2('A'));
+ }
+ return __ret;
+ }
+ template<typename _CharT2>
+ typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
+ int>::__type
+ _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
+ {
+ int __ret = -1;
+ const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
+ if (__q)
+ {
+ __ret = __q - __zero;
+ if (__ret > 15)
+ __ret -= 6;
+ }
+ return __ret;
+ }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned short& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned int& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, unsigned long long& __v) const
+ { return _M_extract_int(__beg, __end, __io, __err, __v); }
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ float&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ long double&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+ void*&) const;
+ };
+ template<typename _CharT, typename _InIter>
+ locale::id num_get<_CharT, _InIter>::id;
+ template<typename _CharT, typename _OutIter>
+ class num_put : public locale::facet
+ {
+ public:
+ typedef _CharT char_type;
+ typedef _OutIter iter_type;
+ static locale::id id;
+ explicit
+ num_put(size_t __refs = 0) : facet(__refs) { }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ unsigned long long __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ long double __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ iter_type
+ put(iter_type __s, ios_base& __f, char_type __fill,
+ const void* __v) const
+ { return this->do_put(__s, __f, __fill, __v); }
+ protected:
+ template<typename _ValueT>
+ iter_type
+ _M_insert_float(iter_type, ios_base& __io, char_type __fill,
+ char __mod, _ValueT __v) const;
+ void
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ char_type __sep, const char_type* __p, char_type* __new,
+ char_type* __cs, int& __len) const;
+ template<typename _ValueT>
+ iter_type
+ _M_insert_int(iter_type, ios_base& __io, char_type __fill,
+ _ValueT __v) const;
+ void
+ _M_group_int(const char* __grouping, size_t __grouping_size,
+ char_type __sep, ios_base& __io, char_type* __new,
+ char_type* __cs, int& __len) const;
+ void
+ _M_pad(char_type __fill, streamsize __w, ios_base& __io,
+ char_type* __new, const char_type* __cs, int& __len) const;
+ virtual
+ ~num_put() { };
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ unsigned long long __v) const
+ { return _M_insert_int(__s, __io, __fill, __v); }
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
+ virtual iter_type
+ do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
+ };
+ template <typename _CharT, typename _OutIter>
+ locale::id num_put<_CharT, _OutIter>::id;
+
+ template<typename _CharT>
+ inline bool
+ isspace(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
+ template<typename _CharT>
+ inline bool
+ isprint(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
+ template<typename _CharT>
+ inline bool
+ iscntrl(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
+ template<typename _CharT>
+ inline bool
+ isupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
+ template<typename _CharT>
+ inline bool
+ islower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
+ template<typename _CharT>
+ inline bool
+ isalpha(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
+ template<typename _CharT>
+ inline bool
+ isdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
+ template<typename _CharT>
+ inline bool
+ ispunct(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
+ template<typename _CharT>
+ inline bool
+ isxdigit(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
+ template<typename _CharT>
+ inline bool
+ isalnum(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
+ template<typename _CharT>
+ inline bool
+ isgraph(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
+ template<typename _CharT>
+ inline _CharT
+ toupper(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
+ template<typename _CharT>
+ inline _CharT
+ tolower(_CharT __c, const locale& __loc)
+ { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
+}
+
+namespace std {
+ template<typename _Facet>
+ struct __use_cache
+ {
+ const _Facet*
+ operator() (const locale& __loc) const;
+ };
+ template<typename _CharT>
+ struct __use_cache<__numpunct_cache<_CharT> >
+ {
+ const __numpunct_cache<_CharT>*
+ operator() (const locale& __loc) const
+ {
+ const size_t __i = numpunct<_CharT>::id._M_id();
+ const locale::facet** __caches = __loc._M_impl->_M_caches;
+ if (!__caches[__i])
+ {
+ __numpunct_cache<_CharT>* __tmp = __null;
+ try
+ {
+ __tmp = new __numpunct_cache<_CharT>;
+ __tmp->_M_cache(__loc);
+ }
+ catch(...)
+ {
+ delete __tmp;
+ throw;
+ }
+ __loc._M_impl->_M_install_cache(__tmp, __i);
+ }
+ return static_cast<const __numpunct_cache<_CharT>*>(__caches[__i]);
+ }
+ };
+ template<typename _CharT>
+ void
+ __numpunct_cache<_CharT>::_M_cache(const locale& __loc)
+ {
+ _M_allocated = true;
+ const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
+ char* __grouping = 0;
+ _CharT* __truename = 0;
+ _CharT* __falsename = 0;
+ try
+ {
+ _M_grouping_size = __np.grouping().size();
+ __grouping = new char[_M_grouping_size];
+ __np.grouping().copy(__grouping, _M_grouping_size);
+ _M_grouping = __grouping;
+ _M_use_grouping = (_M_grouping_size
+ && static_cast<signed char>(_M_grouping[0]) > 0
+ && (_M_grouping[0]
+ != __gnu_cxx::__numeric_traits<char>::__max));
+ _M_truename_size = __np.truename().size();
+ __truename = new _CharT[_M_truename_size];
+ __np.truename().copy(__truename, _M_truename_size);
+ _M_truename = __truename;
+ _M_falsename_size = __np.falsename().size();
+ __falsename = new _CharT[_M_falsename_size];
+ __np.falsename().copy(__falsename, _M_falsename_size);
+ _M_falsename = __falsename;
+ _M_decimal_point = __np.decimal_point();
+ _M_thousands_sep = __np.thousands_sep();
+ const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
+ __ct.widen(__num_base::_S_atoms_out,
+ __num_base::_S_atoms_out
+ + __num_base::_S_oend, _M_atoms_out);
+ __ct.widen(__num_base::_S_atoms_in,
+ __num_base::_S_atoms_in
+ + __num_base::_S_iend, _M_atoms_in);
+ }
+ catch(...)
+ {
+ delete [] __grouping;
+ delete [] __truename;
+ delete [] __falsename;
+ throw;
+ }
+ }
+ __attribute__ ((__pure__)) bool
+ __verify_grouping(const char* __grouping, size_t __grouping_size,
+ const string& __grouping_tmp) throw ();
+
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_float(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, string& __xtrc) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ bool __testeof = __beg == __end;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ __xtrc += __plus ? '+' : '-';
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_mantissa = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero])
+ {
+ if (!__found_mantissa)
+ {
+ __xtrc += '0';
+ __found_mantissa = true;
+ }
+ ++__sep_pos;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ break;
+ }
+ bool __found_dec = false;
+ bool __found_sci = false;
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ const int __digit = _M_find(__lit_zero, 10, __c);
+ if (__digit != -1)
+ {
+ __xtrc += '0' + __digit;
+ __found_mantissa = true;
+ }
+ else if (__c == __lc->_M_decimal_point
+ && !__found_dec && !__found_sci)
+ {
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if (__plus || __c == __lit[__num_base::_S_iminus])
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __xtrc.clear();
+ break;
+ }
+ }
+ else
+ break;
+ }
+ else if (__c == __lc->_M_decimal_point)
+ {
+ if (!__found_dec && !__found_sci)
+ {
+ if (__found_grouping.size())
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += '.';
+ __found_dec = true;
+ }
+ else
+ break;
+ }
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, 10, __c);
+ if (__q)
+ {
+ __xtrc += '0' + (__q - __lit_zero);
+ __found_mantissa = true;
+ ++__sep_pos;
+ }
+ else if ((__c == __lit[__num_base::_S_ie]
+ || __c == __lit[__num_base::_S_iE])
+ && !__found_sci && __found_mantissa)
+ {
+ if (__found_grouping.size() && !__found_dec)
+ __found_grouping += static_cast<char>(__sep_pos);
+ __xtrc += 'e';
+ __found_sci = true;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
+ && !(__lc->_M_use_grouping
+ && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ __xtrc += __plus ? '+' : '-';
+ else
+ continue;
+ }
+ else
+ {
+ __testeof = true;
+ break;
+ }
+ }
+ else
+ break;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ if (!__found_dec && !__found_sci)
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ template<typename _ValueT>
+ _InIter
+ num_get<_CharT, _InIter>::
+ _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
+ ios_base::iostate& __err, _ValueT& __v) const
+ {
+ typedef char_traits<_CharT> __traits_type;
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_in;
+ char_type __c = char_type();
+ const ios_base::fmtflags __basefield = __io.flags()
+ & ios_base::basefield;
+ const bool __oct = __basefield == ios_base::oct;
+ int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);
+ bool __testeof = __beg == __end;
+ bool __negative = false;
+ if (!__testeof)
+ {
+ __c = *__beg;
+ __negative = __c == __lit[__num_base::_S_iminus];
+ if ((__negative || __c == __lit[__num_base::_S_iplus])
+ && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
+ {
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ }
+ bool __found_zero = false;
+ int __sep_pos = 0;
+ while (!__testeof)
+ {
+ if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ || __c == __lc->_M_decimal_point)
+ break;
+ else if (__c == __lit[__num_base::_S_izero]
+ && (!__found_zero || __base == 10))
+ {
+ __found_zero = true;
+ ++__sep_pos;
+ if (__basefield == 0)
+ __base = 8;
+ if (__base == 8)
+ __sep_pos = 0;
+ }
+ else if (__found_zero
+ && (__c == __lit[__num_base::_S_ix]
+ || __c == __lit[__num_base::_S_iX]))
+ {
+ if (__basefield == 0)
+ __base = 16;
+ if (__base == 16)
+ {
+ __found_zero = false;
+ __sep_pos = 0;
+ }
+ else
+ break;
+ }
+ else
+ break;
+ if (++__beg != __end)
+ {
+ __c = *__beg;
+ if (!__found_zero)
+ break;
+ }
+ else
+ __testeof = true;
+ }
+ const size_t __len = (__base == 16 ? __num_base::_S_iend
+ - __num_base::_S_izero : __base);
+ string __found_grouping;
+ if (__lc->_M_use_grouping)
+ __found_grouping.reserve(32);
+ bool __testfail = false;
+ bool __testoverflow = false;
+ const __unsigned_type __max =
+ (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ ? -__gnu_cxx::__numeric_traits<_ValueT>::__min
+ : __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ const __unsigned_type __smax = __max / __base;
+ __unsigned_type __result = 0;
+ int __digit = 0;
+ const char_type* __lit_zero = __lit + __num_base::_S_izero;
+ if (!__lc->_M_allocated)
+ while (!__testeof)
+ {
+ __digit = _M_find(__lit_zero, __len, __c);
+ if (__digit == -1)
+ break;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ else
+ while (!__testeof)
+ {
+ if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
+ {
+ if (__sep_pos)
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ __sep_pos = 0;
+ }
+ else
+ {
+ __testfail = true;
+ break;
+ }
+ }
+ else if (__c == __lc->_M_decimal_point)
+ break;
+ else
+ {
+ const char_type* __q =
+ __traits_type::find(__lit_zero, __len, __c);
+ if (!__q)
+ break;
+ __digit = __q - __lit_zero;
+ if (__digit > 15)
+ __digit -= 6;
+ if (__result > __smax)
+ __testoverflow = true;
+ else
+ {
+ __result *= __base;
+ __testoverflow |= __result > __max - __digit;
+ __result += __digit;
+ ++__sep_pos;
+ }
+ }
+ if (++__beg != __end)
+ __c = *__beg;
+ else
+ __testeof = true;
+ }
+ if (__found_grouping.size())
+ {
+ __found_grouping += static_cast<char>(__sep_pos);
+ if (!std::__verify_grouping(__lc->_M_grouping,
+ __lc->_M_grouping_size,
+ __found_grouping))
+ __err = ios_base::failbit;
+ }
+ if ((!__sep_pos && !__found_zero && !__found_grouping.size())
+ || __testfail)
+ {
+ __v = 0;
+ __err = ios_base::failbit;
+ }
+ else if (__testoverflow)
+ {
+ if (__negative
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__min;
+ else
+ __v = __gnu_cxx::__numeric_traits<_ValueT>::__max;
+ __err = ios_base::failbit;
+ }
+ else
+ __v = __negative ? -__result : __result;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, bool& __v) const
+ {
+ if (!(__io.flags() & ios_base::boolalpha))
+ {
+ long __l = -1;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __l);
+ if (__l == 0 || __l == 1)
+ __v = bool(__l);
+ else
+ {
+ __v = true;
+ __err = ios_base::failbit;
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ }
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ bool __testf = true;
+ bool __testt = true;
+ bool __donef = __lc->_M_falsename_size == 0;
+ bool __donet = __lc->_M_truename_size == 0;
+ bool __testeof = false;
+ size_t __n = 0;
+ while (!__donef || !__donet)
+ {
+ if (__beg == __end)
+ {
+ __testeof = true;
+ break;
+ }
+ const char_type __c = *__beg;
+ if (!__donef)
+ __testf = __c == __lc->_M_falsename[__n];
+ if (!__testf && __donet)
+ break;
+ if (!__donet)
+ __testt = __c == __lc->_M_truename[__n];
+ if (!__testt && __donef)
+ break;
+ if (!__testt && !__testf)
+ break;
+ ++__n;
+ ++__beg;
+ __donef = !__testf || __n >= __lc->_M_falsename_size;
+ __donet = !__testt || __n >= __lc->_M_truename_size;
+ }
+ if (__testf && __n == __lc->_M_falsename_size && __n)
+ {
+ __v = false;
+ if (__testt && __n == __lc->_M_truename_size)
+ __err = ios_base::failbit;
+ else
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else if (__testt && __n == __lc->_M_truename_size && __n)
+ {
+ __v = true;
+ __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
+ }
+ else
+ {
+ __v = false;
+ __err = ios_base::failbit;
+ if (__testeof)
+ __err |= ios_base::eofbit;
+ }
+ }
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, float& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, long double& __v) const
+ {
+ string __xtrc;
+ __xtrc.reserve(32);
+ __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+ std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+ if (__beg == __end)
+ __err |= ios_base::eofbit;
+ return __beg;
+ }
+ template<typename _CharT, typename _InIter>
+ _InIter
+ num_get<_CharT, _InIter>::
+ do_get(iter_type __beg, iter_type __end, ios_base& __io,
+ ios_base::iostate& __err, void*& __v) const
+ {
+ typedef ios_base::fmtflags fmtflags;
+ const fmtflags __fmt = __io.flags();
+ __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex);
+ typedef __gnu_cxx::__conditional_type<(sizeof(void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ _UIntPtrType __ul;
+ __beg = _M_extract_int(__beg, __end, __io, __err, __ul);
+ __io.flags(__fmt);
+ __v = reinterpret_cast<void*>(__ul);
+ return __beg;
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_pad(_CharT __fill, streamsize __w, ios_base& __io,
+ _CharT* __new, const _CharT* __cs, int& __len) const
+ {
+ __pad<_CharT, char_traits<_CharT> >::_S_pad(__io, __fill, __new,
+ __cs, __w, __len);
+ __len = static_cast<int>(__w);
+ }
+
+ template<typename _CharT, typename _ValueT>
+ int
+ __int_to_char(_CharT* __bufend, _ValueT __v, const _CharT* __lit,
+ ios_base::fmtflags __flags, bool __dec)
+ {
+ _CharT* __buf = __bufend;
+ if (__builtin_expect(__dec, true))
+ {
+ do
+ {
+ *--__buf = __lit[(__v % 10) + __num_base::_S_odigits];
+ __v /= 10;
+ }
+ while (__v != 0);
+ }
+ else if ((__flags & ios_base::basefield) == ios_base::oct)
+ {
+ do
+ {
+ *--__buf = __lit[(__v & 0x7) + __num_base::_S_odigits];
+ __v >>= 3;
+ }
+ while (__v != 0);
+ }
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ const int __case_offset = __uppercase ? __num_base::_S_oudigits
+ : __num_base::_S_odigits;
+ do
+ {
+ *--__buf = __lit[(__v & 0xf) + __case_offset];
+ __v >>= 4;
+ }
+ while (__v != 0);
+ }
+ return __bufend - __buf;
+ }
+
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_int(const char* __grouping, size_t __grouping_size, _CharT __sep,
+ ios_base&, _CharT* __new, _CharT* __cs, int& __len) const
+ {
+ _CharT* __p = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size, __cs, __cs + __len);
+ __len = __p - __new;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
+ _ValueT __v) const
+ {
+ using __gnu_cxx::__add_unsigned;
+ typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __lit = __lc->_M_atoms_out;
+ const ios_base::fmtflags __flags = __io.flags();
+ const int __ilen = 5 * sizeof(_ValueT);
+ _CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __ilen));
+ const ios_base::fmtflags __basefield = __flags & ios_base::basefield;
+ const bool __dec = (__basefield != ios_base::oct
+ && __basefield != ios_base::hex);
+ const __unsigned_type __u = ((__v > 0 || !__dec)
+ ? __unsigned_type(__v)
+ : -__unsigned_type(__v));
+ int __len = __int_to_char(__cs + __ilen, __u, __lit, __flags, __dec);
+ __cs += __ilen - __len;
+ if (__lc->_M_use_grouping)
+ {
+ _CharT* __cs2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * (__len + 1)
+ * 2));
+ _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __io, __cs2 + 2, __cs, __len);
+ __cs = __cs2 + 2;
+ }
+ if (__builtin_expect(__dec, true))
+ {
+ if (__v >= 0)
+ {
+ if (bool(__flags & ios_base::showpos)
+ && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
+ *--__cs = __lit[__num_base::_S_oplus], ++__len;
+ }
+ else
+ *--__cs = __lit[__num_base::_S_ominus], ++__len;
+ }
+ else if (bool(__flags & ios_base::showbase) && __v)
+ {
+ if (__basefield == ios_base::oct)
+ *--__cs = __lit[__num_base::_S_odigits], ++__len;
+ else
+ {
+ const bool __uppercase = __flags & ios_base::uppercase;
+ *--__cs = __lit[__num_base::_S_ox + __uppercase];
+ *--__cs = __lit[__num_base::_S_odigits];
+ __len += 2;
+ }
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __cs3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __cs3, __cs, __len);
+ __cs = __cs3;
+ }
+ __io.width(0);
+ return std::__write(__s, __cs, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ void
+ num_put<_CharT, _OutIter>::
+ _M_group_float(const char* __grouping, size_t __grouping_size,
+ _CharT __sep, const _CharT* __p, _CharT* __new,
+ _CharT* __cs, int& __len) const
+ {
+ const int __declen = __p ? __p - __cs : __len;
+ _CharT* __p2 = std::__add_grouping(__new, __sep, __grouping,
+ __grouping_size,
+ __cs, __cs + __declen);
+ int __newlen = __p2 - __new;
+ if (__p)
+ {
+ char_traits<_CharT>::copy(__p2, __p, __len - __declen);
+ __newlen += __len - __declen;
+ }
+ __len = __newlen;
+ }
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
+ _ValueT __v) const
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const streamsize __prec = __io.precision() < 0 ? 6 : __io.precision();
+ const int __max_digits =
+ __gnu_cxx::__numeric_traits<_ValueT>::__digits10;
+ int __len;
+ char __fbuf[16];
+ __num_base::_S_format_float(__io, __fbuf, __mod);
+ const bool __fixed = __io.flags() & ios_base::fixed;
+ const int __max_exp =
+ __gnu_cxx::__numeric_traits<_ValueT>::__max_exponent10;
+ const int __cs_size = __fixed ? __max_exp + __prec + 4
+ : __max_digits * 2 + __prec;
+ char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
+ __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, __fbuf,
+ __prec, __v);
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len));
+ __ctype.widen(__cs, __cs + __len, __ws);
+ _CharT* __wp = 0;
+ const char* __p = char_traits<char>::find(__cs, __len, '.');
+ if (__p)
+ {
+ __wp = __ws + (__p - __cs);
+ *__wp = __lc->_M_decimal_point;
+ }
+ if (__lc->_M_use_grouping
+ && (__wp || __len < 3 || (__cs[1] <= '9' && __cs[2] <= '9'
+ && __cs[1] >= '0' && __cs[2] >= '0')))
+ {
+ _CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __len * 2));
+ streamsize __off = 0;
+ if (__cs[0] == '-' || __cs[0] == '+')
+ {
+ __off = 1;
+ __ws2[0] = __ws[0];
+ __len -= 1;
+ }
+ _M_group_float(__lc->_M_grouping, __lc->_M_grouping_size,
+ __lc->_M_thousands_sep, __wp, __ws2 + __off,
+ __ws + __off, __len);
+ __len += __off;
+ __ws = __ws2;
+ }
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ _CharT* __ws3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __w));
+ _M_pad(__fill, __w, __io, __ws3, __ws, __len);
+ __ws = __ws3;
+ }
+ __io.width(0);
+ return std::__write(__s, __ws, __len);
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ if ((__flags & ios_base::boolalpha) == 0)
+ {
+ const long __l = __v;
+ __s = _M_insert_int(__s, __io, __fill, __l);
+ }
+ else
+ {
+ typedef __numpunct_cache<_CharT> __cache_type;
+ __use_cache<__cache_type> __uc;
+ const locale& __loc = __io._M_getloc();
+ const __cache_type* __lc = __uc(__loc);
+ const _CharT* __name = __v ? __lc->_M_truename
+ : __lc->_M_falsename;
+ int __len = __v ? __lc->_M_truename_size
+ : __lc->_M_falsename_size;
+ const streamsize __w = __io.width();
+ if (__w > static_cast<streamsize>(__len))
+ {
+ const streamsize __plen = __w - __len;
+ _CharT* __ps
+ = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
+ * __plen));
+ char_traits<_CharT>::assign(__ps, __plen, __fill);
+ __io.width(0);
+ if ((__flags & ios_base::adjustfield) == ios_base::left)
+ {
+ __s = std::__write(__s, __name, __len);
+ __s = std::__write(__s, __ps, __plen);
+ }
+ else
+ {
+ __s = std::__write(__s, __ps, __plen);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ __io.width(0);
+ __s = std::__write(__s, __name, __len);
+ }
+ return __s;
+ }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
+ { return _M_insert_float(__s, __io, __fill, char(), __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ long double __v) const
+ { return _M_insert_float(__s, __io, __fill, 'L', __v); }
+ template<typename _CharT, typename _OutIter>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ do_put(iter_type __s, ios_base& __io, char_type __fill,
+ const void* __v) const
+ {
+ const ios_base::fmtflags __flags = __io.flags();
+ const ios_base::fmtflags __fmt = ~(ios_base::basefield
+ | ios_base::uppercase);
+ __io.flags((__flags & __fmt) | (ios_base::hex | ios_base::showbase));
+ typedef __gnu_cxx::__conditional_type<(sizeof(const void*)
+ <= sizeof(unsigned long)),
+ unsigned long, unsigned long long>::__type _UIntPtrType;
+ __s = _M_insert_int(__s, __io, __fill,
+ reinterpret_cast<_UIntPtrType>(__v));
+ __io.flags(__flags);
+ return __s;
+ }
+
+ template<typename _CharT, typename _Traits>
+ void
+ __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill,
+ _CharT* __news, const _CharT* __olds,
+ streamsize __newlen, streamsize __oldlen)
+ {
+ const size_t __plen = static_cast<size_t>(__newlen - __oldlen);
+ const ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;
+ if (__adjust == ios_base::left)
+ {
+ _Traits::copy(__news, __olds, __oldlen);
+ _Traits::assign(__news + __oldlen, __plen, __fill);
+ return;
+ }
+ size_t __mod = 0;
+ if (__adjust == ios_base::internal)
+ {
+ const locale& __loc = __io._M_getloc();
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
+ if (__ctype.widen('-') == __olds[0]
+ || __ctype.widen('+') == __olds[0])
+ {
+ __news[0] = __olds[0];
+ __mod = 1;
+ ++__news;
+ }
+ else if (__ctype.widen('0') == __olds[0]
+ && __oldlen > 1
+ && (__ctype.widen('x') == __olds[1]
+ || __ctype.widen('X') == __olds[1]))
+ {
+ __news[0] = __olds[0];
+ __news[1] = __olds[1];
+ __mod = 2;
+ __news += 2;
+ }
+ }
+ _Traits::assign(__news, __plen, __fill);
+ _Traits::copy(__news + __plen, __olds + __mod, __oldlen - __mod);
+ }
+ template<typename _CharT>
+ _CharT*
+ __add_grouping(_CharT* __s, _CharT __sep,
+ const char* __gbeg, size_t __gsize,
+ const _CharT* __first, const _CharT* __last)
+ {
+ size_t __idx = 0;
+ size_t __ctr = 0;
+ while (__last - __first > __gbeg[__idx]
+ && static_cast<signed char>(__gbeg[__idx]) > 0
+ && __gbeg[__idx] != __gnu_cxx::__numeric_traits<char>::__max)
+ {
+ __last -= __gbeg[__idx];
+ __idx < __gsize - 1 ? ++__idx : ++__ctr;
+ }
+ while (__first != __last)
+ *__s++ = *__first++;
+ while (__ctr--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ while (__idx--)
+ {
+ *__s++ = __sep;
+ for (char __i = __gbeg[__idx]; __i > 0; --__i)
+ *__s++ = *__first++;
+ }
+ return __s;
+ }
+ extern template class numpunct<char>;
+ extern template class numpunct_byname<char>;
+ extern template class num_get<char>;
+ extern template class num_put<char>;
+ extern template class ctype_byname<char>;
+ extern template
+ const ctype<char>&
+ use_facet<ctype<char> >(const locale&);
+ extern template
+ const numpunct<char>&
+ use_facet<numpunct<char> >(const locale&);
+ extern template
+ const num_put<char>&
+ use_facet<num_put<char> >(const locale&);
+ extern template
+ const num_get<char>&
+ use_facet<num_get<char> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<char> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<char> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<char> >(const locale&);
+ extern template class numpunct<wchar_t>;
+ extern template class numpunct_byname<wchar_t>;
+ extern template class num_get<wchar_t>;
+ extern template class num_put<wchar_t>;
+ extern template class ctype_byname<wchar_t>;
+ extern template
+ const ctype<wchar_t>&
+ use_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ const numpunct<wchar_t>&
+ use_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ const num_put<wchar_t>&
+ use_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ const num_get<wchar_t>&
+ use_facet<num_get<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<ctype<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<numpunct<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_put<wchar_t> >(const locale&);
+ extern template
+ bool
+ has_facet<num_get<wchar_t> >(const locale&);
+}
+namespace std {
+ template<typename _Facet>
+ inline const _Facet&
+ __check_facet(const _Facet* __f)
+ {
+ if (!__f)
+ __throw_bad_cast();
+ return *__f;
+ }
+ template<typename _CharT, typename _Traits>
+ class basic_ios : public ios_base
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef ctype<_CharT> __ctype_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ protected:
+ basic_ostream<_CharT, _Traits>* _M_tie;
+ mutable char_type _M_fill;
+ mutable bool _M_fill_init;
+ basic_streambuf<_CharT, _Traits>* _M_streambuf;
+ const __ctype_type* _M_ctype;
+ const __num_put_type* _M_num_put;
+ const __num_get_type* _M_num_get;
+ public:
+ operator void*() const
+ { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
+ bool
+ operator!() const
+ { return this->fail(); }
+ iostate
+ rdstate() const
+ { return _M_streambuf_state; }
+ void
+ clear(iostate __state = goodbit);
+ void
+ setstate(iostate __state)
+ { this->clear(this->rdstate() | __state); }
+ void
+ _M_setstate(iostate __state)
+ {
+ _M_streambuf_state |= __state;
+ if (this->exceptions() & __state)
+ throw;
+ }
+ bool
+ good() const
+ { return this->rdstate() == 0; }
+ bool
+ eof() const
+ { return (this->rdstate() & eofbit) != 0; }
+ bool
+ fail() const
+ { return (this->rdstate() & (badbit | failbit)) != 0; }
+ bool
+ bad() const
+ { return (this->rdstate() & badbit) != 0; }
+ iostate
+ exceptions() const
+ { return _M_exception; }
+ void
+ exceptions(iostate __except)
+ {
+ _M_exception = __except;
+ this->clear(_M_streambuf_state);
+ }
+ explicit
+ basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
+ : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
+ _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { this->init(__sb); }
+ virtual
+ ~basic_ios() { }
+ basic_ostream<_CharT, _Traits>*
+ tie() const
+ { return _M_tie; }
+ basic_ostream<_CharT, _Traits>*
+ tie(basic_ostream<_CharT, _Traits>* __tiestr)
+ {
+ basic_ostream<_CharT, _Traits>* __old = _M_tie;
+ _M_tie = __tiestr;
+ return __old;
+ }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf() const
+ { return _M_streambuf; }
+ basic_streambuf<_CharT, _Traits>*
+ rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
+ basic_ios&
+ copyfmt(const basic_ios& __rhs);
+ char_type
+ fill() const
+ {
+ if (!_M_fill_init)
+ {
+ _M_fill = this->widen(' ');
+ _M_fill_init = true;
+ }
+ return _M_fill;
+ }
+ char_type
+ fill(char_type __ch)
+ {
+ char_type __old = this->fill();
+ _M_fill = __ch;
+ return __old;
+ }
+ locale
+ imbue(const locale& __loc);
+ char
+ narrow(char_type __c, char __dfault) const
+ { return __check_facet(_M_ctype).narrow(__c, __dfault); }
+ char_type
+ widen(char __c) const
+ { return __check_facet(_M_ctype).widen(__c); }
+ protected:
+ basic_ios()
+ : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
+ _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
+ { }
+ void
+ init(basic_streambuf<_CharT, _Traits>* __sb);
+ void
+ _M_cache_locale(const locale& __loc);
+ };
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::clear(iostate __state)
+ {
+ if (this->rdbuf())
+ _M_streambuf_state = __state;
+ else
+ _M_streambuf_state = __state | badbit;
+ if (this->exceptions() & this->rdstate())
+ __throw_ios_failure(("basic_ios::clear"));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_streambuf<_CharT, _Traits>*
+ basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ basic_streambuf<_CharT, _Traits>* __old = _M_streambuf;
+ _M_streambuf = __sb;
+ this->clear();
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ios<_CharT, _Traits>&
+ basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
+ {
+ if (this != &__rhs)
+ {
+ _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ?
+ _M_local_word : new _Words[__rhs._M_word_size];
+ _Callback_list* __cb = __rhs._M_callbacks;
+ if (__cb)
+ __cb->_M_add_reference();
+ _M_call_callbacks(erase_event);
+ if (_M_word != _M_local_word)
+ {
+ delete [] _M_word;
+ _M_word = 0;
+ }
+ _M_dispose_callbacks();
+ _M_callbacks = __cb;
+ for (int __i = 0; __i < __rhs._M_word_size; ++__i)
+ __words[__i] = __rhs._M_word[__i];
+ _M_word = __words;
+ _M_word_size = __rhs._M_word_size;
+ this->flags(__rhs.flags());
+ this->width(__rhs.width());
+ this->precision(__rhs.precision());
+ this->tie(__rhs.tie());
+ this->fill(__rhs.fill());
+ _M_ios_locale = __rhs.getloc();
+ _M_cache_locale(_M_ios_locale);
+ _M_call_callbacks(copyfmt_event);
+ this->exceptions(__rhs.exceptions());
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ locale
+ basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
+ {
+ locale __old(this->getloc());
+ ios_base::imbue(__loc);
+ _M_cache_locale(__loc);
+ if (this->rdbuf() != 0)
+ this->rdbuf()->pubimbue(__loc);
+ return __old;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
+ {
+ ios_base::_M_init();
+ _M_cache_locale(_M_ios_locale);
+ _M_fill = _CharT();
+ _M_fill_init = false;
+ _M_tie = 0;
+ _M_exception = goodbit;
+ _M_streambuf = __sb;
+ _M_streambuf_state = __sb ? goodbit : badbit;
+ }
+ template<typename _CharT, typename _Traits>
+ void
+ basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc)
+ {
+ if (__builtin_expect(has_facet<__ctype_type>(__loc), true))
+ _M_ctype = &use_facet<__ctype_type>(__loc);
+ else
+ _M_ctype = 0;
+ if (__builtin_expect(has_facet<__num_put_type>(__loc), true))
+ _M_num_put = &use_facet<__num_put_type>(__loc);
+ else
+ _M_num_put = 0;
+ if (__builtin_expect(has_facet<__num_get_type>(__loc), true))
+ _M_num_get = &use_facet<__num_get_type>(__loc);
+ else
+ _M_num_get = 0;
+ }
+ extern template class basic_ios<char>;
+ extern template class basic_ios<wchar_t>;
+}
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+ __num_put_type;
+ typedef ctype<_CharT> __ctype_type;
+ explicit
+ basic_ostream(__streambuf_type* __sb)
+ { this->init(__sb); }
+ virtual
+ ~basic_ostream() { }
+ class sentry;
+ friend class sentry;
+ __ostream_type&
+ operator<<(__ostream_type& (*__pf)(__ostream_type&))
+ {
+ return __pf(*this);
+ }
+ __ostream_type&
+ operator<<(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(ios_base& (*__pf) (ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __ostream_type&
+ operator<<(long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(bool __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(short __n);
+ __ostream_type&
+ operator<<(unsigned short __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(int __n);
+ __ostream_type&
+ operator<<(unsigned int __n)
+ {
+ return _M_insert(static_cast<unsigned long>(__n));
+ }
+ __ostream_type&
+ operator<<(long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(unsigned long long __n)
+ { return _M_insert(__n); }
+ __ostream_type&
+ operator<<(double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(float __f)
+ {
+ return _M_insert(static_cast<double>(__f));
+ }
+ __ostream_type&
+ operator<<(long double __f)
+ { return _M_insert(__f); }
+ __ostream_type&
+ operator<<(const void* __p)
+ { return _M_insert(__p); }
+ __ostream_type&
+ operator<<(__streambuf_type* __sb);
+ __ostream_type&
+ put(char_type __c);
+ void
+ _M_write(const char_type* __s, streamsize __n)
+ {
+ const streamsize __put = this->rdbuf()->sputn(__s, __n);
+ if (__put != __n)
+ this->setstate(ios_base::badbit);
+ }
+ __ostream_type&
+ write(const char_type* __s, streamsize __n);
+ __ostream_type&
+ flush();
+ pos_type
+ tellp();
+ __ostream_type&
+ seekp(pos_type);
+ __ostream_type&
+ seekp(off_type, ios_base::seekdir);
+ protected:
+ basic_ostream()
+ { this->init(0); }
+ template<typename _ValueT>
+ __ostream_type&
+ _M_insert(_ValueT __v);
+ };
+ template <typename _CharT, typename _Traits>
+ class basic_ostream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ basic_ostream<_CharT, _Traits>& _M_os;
+ public:
+ explicit
+ sentry(basic_ostream<_CharT, _Traits>& __os);
+ ~sentry()
+ {
+ if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
+ {
+ if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
+ _M_os.setstate(ios_base::badbit);
+ }
+ }
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
+ { return (__out << __out.widen(__c)); }
+ template <class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, char __c)
+ { return __ostream_insert(__out, &__c, 1); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
+ { return (__out << static_cast<char>(__c)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits> &
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ __ostream_insert(__out, __s,
+ static_cast<streamsize>(_Traits::length(__s)));
+ return __out;
+ }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits>&
+ operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<class _Traits>
+ inline basic_ostream<char, _Traits> &
+ operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
+ { return (__out << reinterpret_cast<const char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ endl(basic_ostream<_CharT, _Traits>& __os)
+ { return flush(__os.put(__os.widen('\n'))); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ ends(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.put(_CharT()); }
+ template<typename _CharT, typename _Traits>
+ inline basic_ostream<_CharT, _Traits>&
+ flush(basic_ostream<_CharT, _Traits>& __os)
+ { return __os.flush(); }
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>::sentry::
+ sentry(basic_ostream<_CharT, _Traits>& __os)
+ : _M_ok(false), _M_os(__os)
+ {
+ if (__os.tie() && __os.good())
+ __os.tie()->flush();
+ if (__os.good())
+ _M_ok = true;
+ else
+ __os.setstate(ios_base::failbit);
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ _M_insert(_ValueT __v)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_put_type& __np = __check_facet(this->_M_num_put);
+ if (__np.put(*this, *this, this->fill(), __v).failed())
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(short __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(int __n)
+ {
+ const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
+ if (__fmt == ios_base::oct || __fmt == ios_base::hex)
+ return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
+ else
+ return _M_insert(static_cast<long>(__n));
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ operator<<(__streambuf_type* __sbin)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this);
+ if (__cerb && __sbin)
+ {
+ try
+ {
+ if (!__copy_streambufs(__sbin, this->rdbuf()))
+ __err |= ios_base::failbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbin)
+ __err |= ios_base::badbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ put(char_type __c)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __put = this->rdbuf()->sputc(__c);
+ if (traits_type::eq_int_type(__put, traits_type::eof()))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ write(const _CharT* __s, streamsize __n)
+ {
+ sentry __cerb(*this);
+ if (__cerb)
+ {
+ try
+ { _M_write(__s, __n); }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ flush()
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_ostream<_CharT, _Traits>::pos_type
+ basic_ostream<_CharT, _Traits>::
+ tellp()
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ basic_ostream<_CharT, _Traits>::
+ seekp(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::out);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
+ {
+ if (!__s)
+ __out.setstate(ios_base::badbit);
+ else
+ {
+ const size_t __clen = char_traits<char>::length(__s);
+ try
+ {
+ struct __ptr_guard
+ {
+ _CharT *__p;
+ __ptr_guard (_CharT *__ip): __p(__ip) { }
+ ~__ptr_guard() { delete[] __p; }
+ _CharT* __get() { return __p; }
+ } __pg (new _CharT[__clen]);
+ _CharT *__ws = __pg.__get();
+ for (size_t __i = 0; __i < __clen; ++__i)
+ __ws[__i] = __out.widen(__s[__i]);
+ __ostream_insert(__out, __ws, __clen);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __out._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __out._M_setstate(ios_base::badbit); }
+ }
+ return __out;
+ }
+ extern template class basic_ostream<char>;
+ extern template ostream& endl(ostream&);
+ extern template ostream& ends(ostream&);
+ extern template ostream& flush(ostream&);
+ extern template ostream& operator<<(ostream&, char);
+ extern template ostream& operator<<(ostream&, unsigned char);
+ extern template ostream& operator<<(ostream&, signed char);
+ extern template ostream& operator<<(ostream&, const char*);
+ extern template ostream& operator<<(ostream&, const unsigned char*);
+ extern template ostream& operator<<(ostream&, const signed char*);
+ extern template ostream& ostream::_M_insert(long);
+ extern template ostream& ostream::_M_insert(unsigned long);
+ extern template ostream& ostream::_M_insert(bool);
+ extern template ostream& ostream::_M_insert(long long);
+ extern template ostream& ostream::_M_insert(unsigned long long);
+ extern template ostream& ostream::_M_insert(double);
+ extern template ostream& ostream::_M_insert(long double);
+ extern template ostream& ostream::_M_insert(const void*);
+ extern template class basic_ostream<wchar_t>;
+ extern template wostream& endl(wostream&);
+ extern template wostream& ends(wostream&);
+ extern template wostream& flush(wostream&);
+ extern template wostream& operator<<(wostream&, wchar_t);
+ extern template wostream& operator<<(wostream&, char);
+ extern template wostream& operator<<(wostream&, const wchar_t*);
+ extern template wostream& operator<<(wostream&, const char*);
+ extern template wostream& wostream::_M_insert(long);
+ extern template wostream& wostream::_M_insert(unsigned long);
+ extern template wostream& wostream::_M_insert(bool);
+ extern template wostream& wostream::_M_insert(long long);
+ extern template wostream& wostream::_M_insert(unsigned long long);
+ extern template wostream& wostream::_M_insert(double);
+ extern template wostream& wostream::_M_insert(long double);
+ extern template wostream& wostream::_M_insert(const void*);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ class basic_istream : virtual public basic_ios<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_ios<_CharT, _Traits> __ios_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ typedef ctype<_CharT> __ctype_type;
+ protected:
+ streamsize _M_gcount;
+ public:
+ explicit
+ basic_istream(__streambuf_type* __sb)
+ : _M_gcount(streamsize(0))
+ { this->init(__sb); }
+ virtual
+ ~basic_istream()
+ { _M_gcount = streamsize(0); }
+ class sentry;
+ friend class sentry;
+ __istream_type&
+ operator>>(__istream_type& (*__pf)(__istream_type&))
+ { return __pf(*this); }
+ __istream_type&
+ operator>>(__ios_type& (*__pf)(__ios_type&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(ios_base& (*__pf)(ios_base&))
+ {
+ __pf(*this);
+ return *this;
+ }
+ __istream_type&
+ operator>>(bool& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(short& __n);
+ __istream_type&
+ operator>>(unsigned short& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(int& __n);
+ __istream_type&
+ operator>>(unsigned int& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(unsigned long long& __n)
+ { return _M_extract(__n); }
+ __istream_type&
+ operator>>(float& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(long double& __f)
+ { return _M_extract(__f); }
+ __istream_type&
+ operator>>(void*& __p)
+ { return _M_extract(__p); }
+ __istream_type&
+ operator>>(__streambuf_type* __sb);
+ streamsize
+ gcount() const
+ { return _M_gcount; }
+ int_type
+ get();
+ __istream_type&
+ get(char_type& __c);
+ __istream_type&
+ get(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ get(char_type* __s, streamsize __n)
+ { return this->get(__s, __n, this->widen('\n')); }
+ __istream_type&
+ get(__streambuf_type& __sb, char_type __delim);
+ __istream_type&
+ get(__streambuf_type& __sb)
+ { return this->get(__sb, this->widen('\n')); }
+ __istream_type&
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ __istream_type&
+ getline(char_type* __s, streamsize __n)
+ { return this->getline(__s, __n, this->widen('\n')); }
+ __istream_type&
+ ignore();
+ __istream_type&
+ ignore(streamsize __n);
+ __istream_type&
+ ignore(streamsize __n, int_type __delim);
+ int_type
+ peek();
+ __istream_type&
+ read(char_type* __s, streamsize __n);
+ streamsize
+ readsome(char_type* __s, streamsize __n);
+ __istream_type&
+ putback(char_type __c);
+ __istream_type&
+ unget();
+ int
+ sync();
+ pos_type
+ tellg();
+ __istream_type&
+ seekg(pos_type);
+ __istream_type&
+ seekg(off_type, ios_base::seekdir);
+ protected:
+ basic_istream()
+ : _M_gcount(streamsize(0))
+ { this->init(0); }
+ template<typename _ValueT>
+ __istream_type&
+ _M_extract(_ValueT& __v);
+ };
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<char>&
+ basic_istream<char>::
+ ignore(streamsize __n, int_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ getline(char_type* __s, streamsize __n, char_type __delim);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n);
+ template<>
+ basic_istream<wchar_t>&
+ basic_istream<wchar_t>::
+ ignore(streamsize __n, int_type __delim);
+ template<typename _CharT, typename _Traits>
+ class basic_istream<_CharT, _Traits>::sentry
+ {
+ bool _M_ok;
+ public:
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::__ctype_type __ctype_type;
+ typedef typename _Traits::int_type __int_type;
+ explicit
+ sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
+ operator bool() const
+ { return _M_ok; }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
+ { return (__in >> reinterpret_cast<char&>(__c)); }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
+ template<>
+ basic_istream<char>&
+ operator>>(basic_istream<char>& __in, char* __s);
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<class _Traits>
+ inline basic_istream<char, _Traits>&
+ operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
+ { return (__in >> reinterpret_cast<char*>(__s)); }
+ template<typename _CharT, typename _Traits>
+ class basic_iostream
+ : public basic_istream<_CharT, _Traits>,
+ public basic_ostream<_CharT, _Traits>
+ {
+ public:
+ typedef _CharT char_type;
+ typedef typename _Traits::int_type int_type;
+ typedef typename _Traits::pos_type pos_type;
+ typedef typename _Traits::off_type off_type;
+ typedef _Traits traits_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ explicit
+ basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
+ : __istream_type(__sb), __ostream_type(__sb) { }
+ virtual
+ ~basic_iostream() { }
+ protected:
+ basic_iostream()
+ : __istream_type(), __ostream_type() { }
+ };
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __is);
+}
+
+namespace std {
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>::sentry::
+ sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ if (__in.good())
+ {
+ if (__in.tie())
+ __in.tie()->flush();
+ if (!__noskip && bool(__in.flags() & ios_base::skipws))
+ {
+ const __int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ const __ctype_type& __ct = __check_facet(__in._M_ctype);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space,
+ traits_type::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ }
+ if (__in.good() && __err == ios_base::goodbit)
+ _M_ok = true;
+ else
+ {
+ __err |= ios_base::failbit;
+ __in.setstate(__err);
+ }
+ }
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ _M_extract(_ValueT& __v)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __v);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(short& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<short>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<short>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<short>::__max;
+ }
+ else
+ __n = short(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(int& __n)
+ {
+ sentry __cerb(*this, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ long __l;
+ const __num_get_type& __ng = __check_facet(this->_M_num_get);
+ __ng.get(*this, 0, *this, __err, __l);
+ if (__l < __gnu_cxx::__numeric_traits<int>::__min)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__min;
+ }
+ else if (__l > __gnu_cxx::__numeric_traits<int>::__max)
+ {
+ __err |= ios_base::failbit;
+ __n = __gnu_cxx::__numeric_traits<int>::__max;
+ }
+ else
+ __n = int(__l);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ operator>>(__streambuf_type* __sbout)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, false);
+ if (__cerb && __sbout)
+ {
+ try
+ {
+ bool __ineof;
+ if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
+ __err |= ios_base::failbit;
+ if (__ineof)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::failbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::failbit); }
+ }
+ else if (!__sbout)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ get(void)
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __c = __eof;
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ __c = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__c, __eof))
+ _M_gcount = 1;
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type& __c)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __cb = this->rdbuf()->sbumpc();
+ if (!traits_type::eq_int_type(__cb, traits_type::eof()))
+ {
+ _M_gcount = 1;
+ __c = traits_type::to_char_type(__cb);
+ }
+ else
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ get(__streambuf_type& __sb, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __this_sb = this->rdbuf();
+ int_type __c = __this_sb->sgetc();
+ char_type __c2 = traits_type::to_char_type(__c);
+ while (!traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim)
+ && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
+ {
+ ++_M_gcount;
+ __c = __this_sb->snextc();
+ __c2 = traits_type::to_char_type(__c);
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ getline(char_type* __s, streamsize __n, char_type __delim)
+ {
+ _M_gcount = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ try
+ {
+ const int_type __idelim = traits_type::to_int_type(__delim);
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ while (_M_gcount + 1 < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __idelim))
+ {
+ *__s++ = traits_type::to_char_type(__c);
+ __c = __sb->snextc();
+ ++_M_gcount;
+ }
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else
+ {
+ if (traits_type::eq_int_type(__c, __idelim))
+ {
+ __sb->sbumpc();
+ ++_M_gcount;
+ }
+ else
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ }
+ if (__n > 0)
+ *__s = char_type();
+ if (!_M_gcount)
+ __err |= ios_base::failbit;
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
+ __err |= ios_base::eofbit;
+ else
+ _M_gcount = 1;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ ignore(streamsize __n, int_type __delim)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb && __n > 0)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ int_type __c = __sb->sgetc();
+ bool __large_ignore = false;
+ while (true)
+ {
+ while (_M_gcount < __n
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ ++_M_gcount;
+ __c = __sb->snextc();
+ }
+ if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
+ && !traits_type::eq_int_type(__c, __eof)
+ && !traits_type::eq_int_type(__c, __delim))
+ {
+ _M_gcount =
+ __gnu_cxx::__numeric_traits<streamsize>::__min;
+ __large_ignore = true;
+ }
+ else
+ break;
+ }
+ if (__large_ignore)
+ _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ if (traits_type::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ else if (traits_type::eq_int_type(__c, __delim))
+ {
+ if (_M_gcount
+ < __gnu_cxx::__numeric_traits<streamsize>::__max)
+ ++_M_gcount;
+ __sb->sbumpc();
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::int_type
+ basic_istream<_CharT, _Traits>::
+ peek(void)
+ {
+ int_type __c = traits_type::eof();
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __c = this->rdbuf()->sgetc();
+ if (traits_type::eq_int_type(__c, traits_type::eof()))
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __c;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ read(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ _M_gcount = this->rdbuf()->sgetn(__s, __n);
+ if (_M_gcount != __n)
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ streamsize
+ basic_istream<_CharT, _Traits>::
+ readsome(char_type* __s, streamsize __n)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const streamsize __num = this->rdbuf()->in_avail();
+ if (__num > 0)
+ _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
+ else if (__num == -1)
+ __err |= ios_base::eofbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return _M_gcount;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ putback(char_type __c)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ unget(void)
+ {
+ _M_gcount = 0;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const int_type __eof = traits_type::eof();
+ __streambuf_type* __sb = this->rdbuf();
+ if (!__sb
+ || traits_type::eq_int_type(__sb->sungetc(), __eof))
+ __err |= ios_base::badbit;
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ int
+ basic_istream<_CharT, _Traits>::
+ sync(void)
+ {
+ int __ret = -1;
+ sentry __cerb(*this, true);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ __streambuf_type* __sb = this->rdbuf();
+ if (__sb)
+ {
+ if (__sb->pubsync() == -1)
+ __err |= ios_base::badbit;
+ else
+ __ret = 0;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ typename basic_istream<_CharT, _Traits>::pos_type
+ basic_istream<_CharT, _Traits>::
+ tellg(void)
+ {
+ pos_type __ret = pos_type(-1);
+ try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
+ ios_base::in);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ return __ret;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(pos_type __pos)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ seekg(off_type __off, ios_base::seekdir __dir)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ if (!this->fail())
+ {
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::in);
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
+ return *this;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::int_type __int_type;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ try
+ {
+ const __int_type __cb = __in.rdbuf()->sbumpc();
+ if (!_Traits::eq_int_type(__cb, _Traits::eof()))
+ __c = _Traits::to_char_type(__cb);
+ else
+ __err |= (ios_base::eofbit | ios_base::failbit);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ if (__err)
+ __in.setstate(__err);
+ }
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename _Traits::int_type int_type;
+ typedef _CharT char_type;
+ typedef ctype<_CharT> __ctype_type;
+ streamsize __extracted = 0;
+ ios_base::iostate __err = ios_base::goodbit;
+ typename __istream_type::sentry __cerb(__in, false);
+ if (__cerb)
+ {
+ try
+ {
+ streamsize __num = __in.width();
+ if (__num <= 0)
+ __num = __gnu_cxx::__numeric_traits<streamsize>::__max;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ int_type __c = __sb->sgetc();
+ while (__extracted < __num - 1
+ && !_Traits::eq_int_type(__c, __eof)
+ && !__ct.is(ctype_base::space,
+ _Traits::to_char_type(__c)))
+ {
+ *__s++ = _Traits::to_char_type(__c);
+ ++__extracted;
+ __c = __sb->snextc();
+ }
+ if (_Traits::eq_int_type(__c, __eof))
+ __err |= ios_base::eofbit;
+ *__s = char_type();
+ __in.width(0);
+ }
+ catch(__cxxabiv1::__forced_unwind&)
+ {
+ __in._M_setstate(ios_base::badbit);
+ throw;
+ }
+ catch(...)
+ { __in._M_setstate(ios_base::badbit); }
+ }
+ if (!__extracted)
+ __err |= ios_base::failbit;
+ if (__err)
+ __in.setstate(__err);
+ return __in;
+ }
+ template<typename _CharT, typename _Traits>
+ basic_istream<_CharT, _Traits>&
+ ws(basic_istream<_CharT, _Traits>& __in)
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
+ typedef typename __istream_type::int_type __int_type;
+ typedef ctype<_CharT> __ctype_type;
+ const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
+ const __int_type __eof = _Traits::eof();
+ __streambuf_type* __sb = __in.rdbuf();
+ __int_type __c = __sb->sgetc();
+ while (!_Traits::eq_int_type(__c, __eof)
+ && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
+ __c = __sb->snextc();
+ if (_Traits::eq_int_type(__c, __eof))
+ __in.setstate(ios_base::eofbit);
+ return __in;
+ }
+ extern template class basic_istream<char>;
+ extern template istream& ws(istream&);
+ extern template istream& operator>>(istream&, char&);
+ extern template istream& operator>>(istream&, char*);
+ extern template istream& operator>>(istream&, unsigned char&);
+ extern template istream& operator>>(istream&, signed char&);
+ extern template istream& operator>>(istream&, unsigned char*);
+ extern template istream& operator>>(istream&, signed char*);
+ extern template istream& istream::_M_extract(unsigned short&);
+ extern template istream& istream::_M_extract(unsigned int&);
+ extern template istream& istream::_M_extract(long&);
+ extern template istream& istream::_M_extract(unsigned long&);
+ extern template istream& istream::_M_extract(bool&);
+ extern template istream& istream::_M_extract(long long&);
+ extern template istream& istream::_M_extract(unsigned long long&);
+ extern template istream& istream::_M_extract(float&);
+ extern template istream& istream::_M_extract(double&);
+ extern template istream& istream::_M_extract(long double&);
+ extern template istream& istream::_M_extract(void*&);
+ extern template class basic_iostream<char>;
+ extern template class basic_istream<wchar_t>;
+ extern template wistream& ws(wistream&);
+ extern template wistream& operator>>(wistream&, wchar_t&);
+ extern template wistream& operator>>(wistream&, wchar_t*);
+ extern template wistream& wistream::_M_extract(unsigned short&);
+ extern template wistream& wistream::_M_extract(unsigned int&);
+ extern template wistream& wistream::_M_extract(long&);
+ extern template wistream& wistream::_M_extract(unsigned long&);
+ extern template wistream& wistream::_M_extract(bool&);
+ extern template wistream& wistream::_M_extract(long long&);
+ extern template wistream& wistream::_M_extract(unsigned long long&);
+ extern template wistream& wistream::_M_extract(float&);
+ extern template wistream& wistream::_M_extract(double&);
+ extern template wistream& wistream::_M_extract(long double&);
+ extern template wistream& wistream::_M_extract(void*&);
+ extern template class basic_iostream<wchar_t>;
+}
+namespace std {
+ extern istream cin;
+ extern ostream cout;
+ extern ostream cerr;
+ extern ostream clog;
+ extern wistream wcin;
+ extern wostream wcout;
+ extern wostream wcerr;
+ extern wostream wclog;
+ static ios_base::Init __ioinit;
+}
+
+extern "C" {
+void __attribute__((__cdecl__)) __assert (const char *, int, const char *) __attribute__ ((__noreturn__));
+void __attribute__((__cdecl__)) __assert_func (const char *, int, const char *, const char *) __attribute__ ((__noreturn__));
+}
+int main() {
+ int sum = 0, factor = 10;
+ void (*ERROR_missing_result_type_before_the_local_function_parameter_macro_id10)(); typedef void (*boost_closure_auxXdeduce_result_tagX10X)( int ERROR_missing_result_type_before_the_local_function_parameter_macro_id10 ) ; typedef __typeof__(boost::type_of::ensure_obj(::boost::scope_exit::aux::wrap( ::boost::scope_exit::aux::deref( ERROR_missing_result_type_before_the_local_function_parameter_macro_id10, (boost_closure_auxXdeduce_result_tagX10X)0 ) ))) boost_closure_auxXdeduce_result_wrapX10X ; typedef boost_closure_auxXdeduce_result_wrapX10X::type boost_closure_auxXdeduce_result_captureX10X ; struct boost_closure_auxXdeduce_result_paramsX10X { typedef boost_closure_auxXdeduce_result_captureX10X function_ptr; }; typedef ::boost::remove_pointer< boost_closure_auxXdeduce_result_paramsX10X::function_ptr >::type boost_closure_auxXdeduce_result_function_typeX10X ; typedef ::boost::function_traits< boost_closure_auxXdeduce_result_function_typeX10X >::result_type boost_closure_auxXresult_typeX10X ; typedef void
 (*boost_se_tag_0_10)(int & sum); typedef void (*boost_se_tag_1_10)(int factor); typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(& sum, (boost_se_tag_0_10)0)))) boost_se_wrapped_t_0_10; typedef boost_se_wrapped_t_0_10::type boost_se_capture_t_0_10; typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(factor, (boost_se_tag_1_10)0)))) boost_se_wrapped_t_1_10; typedef boost_se_wrapped_t_1_10::type boost_se_capture_t_1_10; struct boost_se_params_t_10 { typedef boost_se_capture_t_0_10 boost_se_param_t_0_10; typedef boost_se_capture_t_1_10 boost_se_param_t_1_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_0_10 , boost_se_tag_0_10 > ) >::arg1_type boost_se_param_0_10; boost::function_traits< void ( ::boost::scope_exit::aux::member< boost_se_param_t_1_10 , boost_se_tag_1_10 > ) >::arg1_type boost_se_param_1_10; } boost_closure_auxXparamsX10X = { { boost::scope_exit::aux
::deref(& sum, (boost_se_tag_0_10)0) } , { boost::scope_exit::aux::deref(factor, (boost_se_tag_1_10)0) } }; ::boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< sizeof(boost_closure_auxXargsX) >::cmp1<0>::cmp2 > boost_closure_auxXargsX; boost_closure_auxXargsX.value = &boost_closure_auxXparamsX10X; class boost_closure_auxXfunctorX10X { typedef boost_closure_auxXresult_typeX10X (boost_closure_auxXfunction_typeX) ( int num ); typedef boost::function_traits< void ( ::boost::local::aux::function< boost_closure_auxXfunction_typeX , 0 > ) >::arg1_type boost_closure_auxXfunctor_typeX ; typedef ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type factorXtypeof_typeXboost_closure_auxX ; typedef boost_se_params_t_10:: boost_se_param_t_1_10 & sumXtypeof_typeXboost_closure_auxX ; public: inline explicit boost_closure_auxXfunctorX10X( void* bind_params) : boost_closure_auxXbindX0X ( static_cast< boost_se_params_t_10* >(bind_params)-> boost_se_param_0_10.value ) , boost_closure_auxXbind
X1X ( static_cast< boost_se_params_t_10* >(bind_params)-> boost_se_param_1_10.value ) { } inline boost_closure_auxXresult_typeX10X operator()( ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) const { return boost_closure_auxXbodyX( boost_closure_auxXbindX0X , boost_closure_auxXbindX1X , arg1 ); } inline static boost_closure_auxXresult_typeX10X boost_closure_auxXcallX0X( void* object , ::boost::call_traits< ::boost::function_traits< boost_closure_auxXfunction_typeX >::arg1_type >::param_type arg1 ) { return static_cast< boost_closure_auxXfunctorX10X* >( object)->operator()( arg1 ); } inline static void boost_closure_auxXinit_callX( void* object, boost_closure_auxXfunctor_typeX& functor) { functor.boost_closure_auxXinit_callX(object, &boost_closure_auxXcallX0X ); } private: ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type & boost_closure_auxXbindX0X ; boost_se_params_t_10:: boost_se_param_t_1_10 & boost_closure_auxXbindX1
X ; boost::scope_exit::aux::undeclared boost_closure_auxXargsX; inline boost_closure_auxXresult_typeX10X boost_closure_auxXbodyX( ::boost::add_const< boost_se_params_t_10:: boost_se_param_t_0_10 >::type factor , boost_se_params_t_10:: boost_se_param_t_1_10 & sum , int num ) const {
+ sum += factor * num;
+ std::cout << "Summed: " << sum << std::endl;
+ } public: boost_closure_auxXfunctor_typeX boost_closure_auxXnon_recursiveX; } boost_closure_auxXaddX(boost_closure_auxXargsX.value); __typeof__(boost::type_of::ensure_obj(boost_closure_auxXaddX. boost_closure_auxXnon_recursiveX)) add; boost_closure_auxXaddX.boost_closure_auxXinit_callX( &boost_closure_auxXaddX, add);
+ add(1);
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add);
+ ((sum == 60) ? (void)0 : __assert_func ("02.cpp", 20, __PRETTY_FUNCTION__, "sum == 60"));
+ return 0;
+}

Added: sandbox/closure/example_add.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/example_add.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,22 @@
+
+//[example_add_cpp
+#include <boost/closure.hpp>
+#include <algorithm>
+#include <cstdlib>
+
+int main(void) {
+ int sum = 0, factor = 10;
+
+ void BOOST_CLOSURE(int num, const bind factor, bind& sum) {
+ sum += factor * num;
+ } BOOST_CLOSURE_END(add)
+
+ add(1); // Call the function closure.
+
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add); // Pass the closure to an algorithm.
+
+ return (sum == 60) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+//]
+

Added: sandbox/closure/example_add_lambda.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/example_add_lambda.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,22 @@
+
+//[example_add_lambda_cpp
+#include <boost/closure.hpp>
+#include <algorithm>
+#include <cstdlib>
+
+int main(void) {
+ int sum = 0, factor = 10;
+
+ auto add = [factor, &sum](int num) {
+ sum += factor * num;
+ };
+
+ add(1); // Call the lambda function.
+
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add); // Pass the lambda to an algorithm.
+
+ return (sum == 60) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+//]
+

Added: sandbox/closure/example_gcc_lambda.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/example_gcc_lambda.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,21 @@
+
+//[example_add_cpp
+#include <gcc_lambda.hpp>
+#include <algorithm>
+#include <cstdlib>
+
+int main(void) {
+ int val = 2;
+ int nums[] = {1, 2, 3};
+ int* end = nums + 3;
+
+ int* iter = std::find_if(nums, end,
+ GCC_LAMBDA(const bind val, int num, return bool) {
+ return num == val;
+ } GCC_LAMDA_END
+ );
+
+ return (iter != end) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+//]
+

Added: sandbox/closure/example_gcc_lambda_cpp11.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/example_gcc_lambda_cpp11.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,20 @@
+
+//[example_add_cpp
+#include <algorithm>
+#include <cstdlib>
+
+int main(void) {
+ int val = 2;
+ int nums[] = {1, 2, 3};
+ int* end = nums + 3;
+
+ int* iter = std::find_if(nums, end,
+ [val](int num) -> bool {
+ return num == val;
+ }
+ );
+
+ return (iter != end) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+//]
+

Added: sandbox/closure/f01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,102 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <iostream>
+#include <string>
+#include <typeinfo>
+
+template<typename F, int Arity> struct compose_arity {};
+template<typename F> struct compose_arity<F, 0> {
+ typedef typename F::result_type (type)(
+ );
+};
+template<typename F> struct compose_arity<F, 1> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ );
+};
+template<typename F> struct compose_arity<F, 2> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ , typename F::arg2_type
+ );
+};
+
+template<typename F>
+struct compose {
+ typedef typename compose_arity<F, F::arity>::type type;
+};
+
+// Precondition: F is not ptr or ref to function.
+template<typename F>
+struct dispatch {
+ typedef
+ typename boost::mpl::if_<boost::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ compose<F>
+ >::type::type
+ type;
+};
+
+template<typename F>
+struct function_type {
+ typedef
+ typename dispatch<
+ typename boost::remove_pointer<
+ typename boost::remove_reference<
+ F
+ >::type>::type>::type
+ type;
+};
+
+template<typename F0, typename F1, typename F2>
+boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+>
+make_overload(F0 f0, F1 f1, F2 f2) {
+/* std::cout << "xx\n";
+ std::cout << typeid(typename function_type<F0>::type).name() << std::endl;
+ std::cout << typeid(typename function_type<F1>::type).name() << std::endl;
+ std::cout << typeid(typename function_type<F2>::type).name() << std::endl;
+ std::cout << "yy\n";*/
+ return boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+ >(f0, f1, f2);
+}
+
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d(double d) { std::cout << d << std::endl; }
+
+int main(void) {
+ boost::function<void (double)> pd = print_d;
+ print_s("abc");
+ print_i(123);
+ pd(1.23);
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, pd);
+ print("abc");
+ print(123);
+ print(1.23);
+
+ make_overload(&print_s, &print_i, pd);
+
+ return 0;
+}
+

Added: sandbox/closure/f02.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f02.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,110 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <iostream>
+#include <string>
+#include <typeinfo>
+
+namespace boost { namespace functional {
+
+namespace detail {
+
+template<typename F, int Arity> struct ftype_compose_arity {};
+template<typename F> struct ftype_compose_arity<F, 0> {
+ typedef typename F::result_type (type)(
+ );
+};
+template<typename F> struct ftype_compose_arity<F, 1> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ );
+};
+template<typename F> struct ftype_compose_arity<F, 2> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ , typename F::arg2_type
+ );
+};
+
+template<typename F>
+struct ftype_compose {
+ typedef typename ftype_compose_arity<F, F::arity>::type type;
+};
+
+// Precondition: F is not ptr or ref to function.
+template<typename F>
+struct ftype_dispatch {
+ typedef
+ typename boost::mpl::if_<boost::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ ftype_compose<F>
+ >::type::type
+ type;
+};
+
+} // namespace detail
+
+template<typename F>
+struct function_type {
+ typedef
+ typename detail::ftype_dispatch<
+ typename boost::remove_pointer<
+ typename boost::remove_reference<
+ F
+ >::type>::type>::type
+ type;
+};
+
+template<typename F0, typename F1, typename F2>
+boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+>
+make_overload(F0 f0, F1 f1, F2 f2) {
+ return boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+ >(f0, f1, f2);
+}
+
+} } // namespace
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d(double d) { std::cout << d << std::endl; }
+
+int main(void) {
+ boost::function<void (double)> pd = print_d;
+ print_s("abc");
+ print_i(123);
+ pd(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, pd);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ BOOST_AUTO(p, boost::functional::make_overload(&print_s, &print_i, pd));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ return 0;
+}
+

Added: sandbox/closure/f03.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f03.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,115 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <iostream>
+#include <string>
+#include <typeinfo>
+
+namespace boost { namespace functional {
+
+namespace detail {
+
+template<typename F, int Arity = -1>
+struct functor_type {
+ typedef typename functor_type<F, F::arity>::type type;
+};
+
+template<typename F>
+struct functor_type<F, 0> {
+ typedef typename F::result_type (type)(
+ );
+};
+
+template<typename F>
+struct functor_type<F, 1> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ );
+};
+
+template<typename F>
+struct functor_type<F, 2> {
+ typedef typename F::result_type (type)(
+ typename F::arg1_type
+ , typename F::arg2_type
+ );
+};
+
+} // namespace detail
+
+template<typename F>
+struct function_type {
+ typedef
+ typename boost::mpl::if_<boost::function_types::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_pointer<F>,
+ boost::remove_pointer<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_reference<F>,
+ boost::remove_reference<F>
+ ,
+ detail::functor_type<F>
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+template<typename F0, typename F1, typename F2>
+boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+>
+make_overload(F0 f0, F1 f1, F2 f2) {
+ return boost::functional::overload<
+ typename function_type<F0>::type
+ , typename function_type<F1>::type
+ , typename function_type<F2>::type
+ >(f0, f1, f2);
+}
+
+} } // namespace
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d(double d) { std::cout << d << std::endl; }
+
+int main(void) {
+ boost::function<void (double)> pd = print_d;
+ print_s("abc");
+ print_i(123);
+ pd(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, pd);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ BOOST_AUTO(p, boost::functional::make_overload(&print_s, &print_i, pd));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ return 0;
+}
+

Added: sandbox/closure/f04.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f04.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,195 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <iostream>
+#include <string>
+#include <typeinfo>
+
+namespace boost { namespace functional {
+
+namespace detail {
+
+// Transform a function F into a functor type.
+// Precondition: F is a function type, a function pointer, a function
+// reference, or already a function
+template<typename F>
+class functor_wrap {
+ template<typename MetaF>
+ struct functor {
+ typedef typename boost::function< typename MetaF::type > type;
+ };
+public:
+ typedef
+ typename boost::mpl::if_< boost::function_types::is_function<F>,
+ functor< boost::mpl::identity<F> >
+ ,
+ typename boost::mpl::if_< boost::function_types::
+ is_function_pointer< F >,
+ functor< boost::remove_pointer< F > >
+ ,
+ typename boost::mpl::if_< boost::function_types::
+ is_function_reference< F >,
+ functor< boost::remove_reference< F > >
+ , // Requires: It's already a functor.
+ boost::mpl::identity< F >
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+// Transform a functor F into a function type.
+template<typename F>
+struct functor_unwrap {
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front< // Remove functor type (1st).
+ typename boost::function_types::parameter_types<F>::type
+ >::type
+ , typename boost::function_types::result_type<F>::type
+ >::type
+ >::type
+ type;
+
+};
+
+template<typename F0, typename F1, typename F2>
+struct overload_type {
+ typedef boost::functional::overload<
+ typename detail::functor_unwrap<
+ BOOST_TYPEOF_TPL(&(detail::functor_wrap<F0>::type::operator()))
+ >::type
+ , typename detail::functor_unwrap<
+ BOOST_TYPEOF_TPL(&(detail::functor_wrap<F1>::type::operator()))
+ >::type
+ , typename detail::functor_unwrap<
+ BOOST_TYPEOF_TPL(&(detail::functor_wrap<F2>::type::operator()))
+ >::type
+ > type;
+};
+
+template<
+ typename F0, typename Call0
+ , typename F1, typename Call1
+ , typename F2, typename Call2
+>
+boost::functional::overload<
+ typename functor_unwrap< Call0 >::type
+ , typename functor_unwrap< Call1 >::type
+ , typename functor_unwrap< Call2 >::type
+> make_overload(F0 f0, Call0, F1 f1, Call1, F2 f2, Call2) {
+ std::cout << std::endl;
+ std::cout << typeid(functor_unwrap<Call0>::type).name() << std::endl;
+ std::cout << typeid(functor_unwrap<Call1>::type).name() << std::endl;
+ std::cout << typeid(functor_unwrap<Call2>::type).name() << std::endl;
+ return boost::functional::overload<
+ typename functor_unwrap< Call0 >::type
+ , typename functor_unwrap< Call1 >::type
+ , typename functor_unwrap< Call2 >::type
+ >(f0, f1, f2);
+}
+
+} // namespace detail
+
+template<typename F0, typename F1, typename F2>
+/*boost::functional::overload<
+ BOOST_TYPEOF_TPL(&detail::functor_wrap<F0>::type::operator())
+ , BOOST_TYPEOF_TPL(&detail::functor_wrap<F1>::type::operator())
+ , BOOST_TYPEOF_TPL(&detail::functor_wrap<F2>::type::operator())
+>*/
+typename detail::overload_type<F0, F1, F2>::type
+make_overload(F0 f0, F1 f1, F2 f2) {
+ std::cout << typeid(typename detail::functor_wrap<F0>::type).name() << std::endl;
+ std::cout << typeid(typename detail::functor_wrap<F1>::type).name() << std::endl;
+ std::cout << typeid(typename detail::functor_wrap<F2>::type).name() << std::endl;
+
+ typedef
+ typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F0>::type::operator()))
+ >::type
+ ftype0;
+ typedef
+ typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F1>::type::operator()))
+ >::type
+ ftype1;
+ typedef
+ typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F2>::type::operator()))
+ >::type
+ ftype2;
+ std::cout << "x " << typeid(ftype2).name() << std::endl;
+
+ boost::functional::overload<
+ typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F0>::type::operator()))
+ >::type
+ , typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F1>::type::operator()))
+ >::type
+ , typename detail::functor_unwrap<
+ BOOST_TYPEOF(&(detail::functor_wrap<F2>::type::operator()))
+ >::type
+ > f(f0, f1, f2);
+
+ typename detail::overload_type<F0, F1, F2>::type g(f0, f1, f2);
+ return g;
+
+ /*
+ detail::make_overload(
+ f0, &(typename detail::functor_wrap<F0>::type::operator())
+ , f1, &(typename detail::functor_wrap<F1>::type::operator())
+ , f2, &(typename detail::functor_wrap<F2>::type::operator())
+ );*/
+}
+
+} } // namespace
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d(double d) { std::cout << d << std::endl; }
+
+int main(void) {
+ boost::function<void (double)> pd = print_d;
+ print_s("abc");
+ print_i(123);
+ pd(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, pd);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ boost::functional::make_overload(&print_s, &print_i, pd);
+ //BOOST_AUTO(p, boost::functional::make_overload(&print_s, &print_i, pd));
+/*
+ BOOST_AUTO(p, boost::functional::make_overload(&print_s, &print_i, pd));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+*/
+ return 0;
+}
+

Added: sandbox/closure/f05.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f05.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,122 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <iostream>
+#include <string>
+
+namespace boost { namespace functional {
+
+namespace detail { namespace overload {
+
+// Transform a function F into a functor type.
+// Precondition: F is a function type, a function pointer, a function
+// reference, or already a functor.
+template<typename F>
+class functor_wrap {
+ template<typename MetaF>
+ struct functor {
+ typedef typename boost::function< typename MetaF::type > type;
+ };
+public:
+ typedef
+ typename boost::mpl::if_< boost::function_types::is_function<F>,
+ functor< boost::mpl::identity<F> >
+ ,
+ typename boost::mpl::if_< boost::function_types::
+ is_function_pointer< F >,
+ functor< boost::remove_pointer< F > >
+ ,
+ typename boost::mpl::if_< boost::function_types::
+ is_function_reference< F >,
+ functor< boost::remove_reference< F > >
+ , // Requires: It's already a functor.
+ boost::mpl::identity< F >
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+// Transform a functor F into a function type.
+template<typename F>
+struct functor_unwrap {
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front< // Remove functor type (1st).
+ typename boost::function_types::parameter_types<F>::type
+ >::type
+ , typename boost::function_types::result_type<F>::type
+ >::type
+ >::type
+ type;
+};
+
+template<typename F0, typename F1, typename F2>
+struct deduce_type {
+ typedef boost::functional::overload<
+ typename functor_unwrap<
+ BOOST_TYPEOF_TPL(&(functor_wrap<F0>::type::operator()))
+ >::type
+ , typename functor_unwrap<
+ BOOST_TYPEOF_TPL(&(functor_wrap<F1>::type::operator()))
+ >::type
+ , typename functor_unwrap<
+ BOOST_TYPEOF_TPL(&(functor_wrap<F2>::type::operator()))
+ >::type
+ > type;
+};
+
+} } // namespace detail::overload
+
+template<typename F0, typename F1, typename F2>
+typename detail::overload::deduce_type<F0, F1, F2>::type
+make_overload(F0 f0, F1 f1, F2 f2) {
+ return typename detail::overload::deduce_type<F0, F1, F2>::type(f0, f1, f2);
+}
+
+} } // namespace boost::functional
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d(double d) { std::cout << d << std::endl; }
+
+int main(void) {
+ boost::function<void (double)> pd = print_d;
+ print_s("abc");
+ print_i(123);
+ pd(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, pd);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ BOOST_AUTO(p, boost::functional::make_overload(&print_s, &print_i, pd));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ return 0;
+}
+

Added: sandbox/closure/f06.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f06.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,119 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <iostream>
+#include <string>
+
+namespace boost { namespace functional {
+
+namespace detail {
+
+// Requires: F is a monomorphic functor (i.e., has non-template `operator()`).
+template<typename F>
+class functor_type {
+ typedef BOOST_TYPEOF_TPL(&(F::operator())) call_ptr;
+public:
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front< // Remove functor type (1st).
+ typename boost::function_types::parameter_types<
+ call_ptr>::type
+ >::type
+ , typename boost::function_types::result_type<call_ptr>::type
+ >::type
+ >::type
+ type;
+};
+
+// Requires: F is a function type, pointer, reference, or monomorphic functor.
+template<typename F>
+struct function_type {
+ typedef
+ typename boost::mpl::if_<boost::function_types::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_pointer<F>,
+ boost::remove_pointer<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_reference<F>,
+ boost::remove_reference<F>
+ , // Requires, it's a functor.
+ functor_type<F>
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+} // namespace detail
+
+// F must be either a function type, pointer, reference, or monomorphic functor.
+template<typename F0, typename F1, typename F2>
+overload<
+ typename detail::function_type<F0>::type
+ , typename detail::function_type<F1>::type
+ , typename detail::function_type<F2>::type
+> make_overload(F0 f0, F1 f1, F2 f2) {
+ return overload<
+ typename detail::function_type<F0>::type
+ , typename detail::function_type<F1>::type
+ , typename detail::function_type<F2>::type
+ >(f0, f1, f2);
+}
+
+} } // namespace boost::functional
+
+template<typename F>
+void call(F print) {
+ print("abc");
+ print(123);
+ print(1.23);
+}
+
+void print_s(const std::string& s) { std::cout << s << std::endl; }
+void print_i(int i) { std::cout << i << std::endl; }
+void print_d_impl(double d) { std::cout << d << std::endl; }
+boost::function<void (double)> print_d = print_d_impl;
+
+int main(void) {
+ print_s("abc");
+ print_i(123);
+ print_d(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, print_d);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ BOOST_AUTO(p, boost::functional::make_overload(print_s, print_i, print_d));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ call(boost::functional::make_overload(print_s, print_i, print_d));
+ return 0;
+}
+

Added: sandbox/closure/f07.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/f07.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,44 @@
+
+#include <boost/functional/overload.hpp>
+#include <boost/function.hpp>
+#include <iostream>
+#include <string>
+
+template<typename F>
+void call(F print) {
+ print("abc");
+ print(123);
+ print(1.23);
+}
+
+void s(const std::string& s) { std::cout << s << std::endl; }
+void i(int i) { std::cout << i << std::endl; }
+void d_impl(double d) { std::cout << d << std::endl; }
+boost::function<void (double)> d = d_impl;
+
+int main(void) {
+ print_s("abc");
+ print_i(123);
+ print_d(1.23);
+ std::cout << std::endl;
+
+ boost::functional::overload<
+ void (const std::string&)
+ , void (int)
+ , void (double)
+ > print(print_s, print_i, print_d);
+ print("abc");
+ print(123);
+ print(1.23);
+ std::cout << std::endl;
+
+ BOOST_AUTO(p, boost::functional::make_overload(print_s, print_i, print_d));
+ p("abc");
+ p(123);
+ p(1.23);
+ std::cout << std::endl;
+
+ call(boost::functional::make_overload(print_s, print_i, print_d));
+ return 0;
+}
+

Added: sandbox/closure/gcc_lambda.hpp
==============================================================================
--- (empty file)
+++ sandbox/closure/gcc_lambda.hpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,34 @@
+
+//[example_gcc_lambda_hpp
+// Header: gcc_lambda.hpp
+#ifndef GCC_LAMBDA_HPP_
+#define GCC_LAMBDA_HPP_
+
+#include <boost/closure.hpp>
+
+// PUBLIC //
+
+// void | [const] bind[&] var_ | type_ name_ [, default value_] | return type_
+#define GCC_LAMBDA(...) \
+ ({ /* open a GCC expression statement (GCC extension only) */ \
+ BOOST_CLOSURE(GCC_LAMBDA_RETURN_( \
+ BOOST_CLOSURE_DETAIL_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))
+
+#define GCC_LAMBDA_END \
+ BOOST_CLOSURE_END(BOOST_PP_CAT(gcc_lambda_, __LINE__)) \
+ BOOST_PP_CAT(gcc_lambda, __LINE__); /* expr stmt returns the lambda */ \
+ }) /* close the GCC expression statement (GCC extension only) */
+
+// PRIVATE //
+
+#define GCC_LAMBDA_RETURN_(sign_seq) \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_RETURN_FRONT( \
+ BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(sign_seq))), \
+ sign_seq /* keep result type specified by user */ \
+ , \
+ sign_seq (return void) /* automatically void if no return specified */ \
+ )
+
+#endif // #include guard
+//]
+

Added: sandbox/closure/loctparam.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/loctparam.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,17 @@
+
+#include <algorithm>
+#include <iostream>
+
+int main() {
+ struct s {
+ void operator()(int x) {
+ std::cout << x << std::endl;
+ }
+ } l;
+
+ int nums[] = {1, 2, 3};
+ std::for_each(nums, nums + 3, l);
+
+ return 0;
+}
+

Added: sandbox/closure/proxy.hpp
==============================================================================
--- (empty file)
+++ sandbox/closure/proxy.hpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,78 @@
+
+#ifndef PROXY_HPP_
+#define PROXY_HPP_
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace proxy { namespace aux {
+
+template<class Proxy, typename Ptr>
+struct accessor {
+ BOOST_MPL_ASSERT_MSG(false, ERROR_expected_member_pointer, (Ptr));
+};
+
+template<class Proxy, typename D, class C>
+struct accessor<Proxy, D C::*> {
+ typedef C class_type;
+ typedef D C::* data_ptr;
+ explicit accessor(Proxy& proxy, C* obj, data_ptr data)
+ : proxy_(proxy), obj_(obj), data_(data) {}
+
+ D const& operator=(D const& value)
+ { return proxy_.template set<D, C>(obj_, data_, value); }
+ D& operator=(D& value)
+ { return proxy_.template set<D, C>(obj_, data_, value); }
+
+ operator D const&() const
+ { return proxy_.template get<D, C>(obj_, data_); }
+ operator D&()
+ { return proxy_.template get<D, C>(obj_, data_); }
+private:
+ Proxy& proxy_;
+ C* obj_;
+ data_ptr data_;
+};
+
+template<class Proxy, typename R, class C, typename A0>
+struct accessor<Proxy, R (C::*)(A0)> {
+ typedef C class_type;
+ typedef R (C::* func_ptr)(A0);
+ explicit accessor(Proxy& proxy, C* obj, func_ptr func)
+ : proxy_(proxy), obj_(obj), func_(func) {}
+
+ R operator()(A0 a0) const
+ { return proxy_.template call<R, C, A0>(obj_, func_, a0); }
+ R operator()(A0 a0)
+ { return proxy_.template call<R, C, A0>(obj_, func_, a0); }
+private:
+ Proxy& proxy_;
+ C* obj_;
+ func_ptr func_;
+};
+
+}} // namespace
+
+template<class Class, class Proxy>
+struct proxy_ptr {
+ /* implicit */ proxy_ptr(Class* obj) : proxy_(), obj_(obj) {}
+ virtual ~proxy_ptr() { delete obj_; }
+
+ template<typename F>
+ proxy::aux::accessor<Proxy, F> operator->*(F func) {
+ typedef typename proxy::aux::accessor<Proxy, F>::class_type f_class;
+ BOOST_MPL_ASSERT_MSG((boost::is_same<Class, f_class>::value),
+ ERROR_expected_member_pointer_of_class, (Class));
+ // f_class* cast used to reduce verbosity of compiler errors (always
+ // safe because of static assertion above).
+ return proxy::aux::accessor<Proxy, F>(proxy_, (f_class*)obj_, func);
+ }
+
+private:
+ Proxy proxy_;
+ Class* obj_;
+};
+
+#endif // #include guard
+

Added: sandbox/closure/proxy_ptr.hpp
==============================================================================
--- (empty file)
+++ sandbox/closure/proxy_ptr.hpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,78 @@
+
+#ifndef PROXY_PTR_HPP_
+#define PROXY_PTR_HPP_
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace proxy_ptr_aux {
+
+template<class Proxy, typename Ptr>
+struct accessor {
+ BOOST_MPL_ASSERT_MSG(false, ERROR_expected_member_pointer, (Ptr));
+};
+
+template<class Proxy, typename D, class C>
+struct accessor<Proxy, D C::*> {
+ typedef C class_type;
+ typedef D C::* data_ptr;
+ explicit accessor(Proxy& proxy, C* obj, data_ptr data)
+ : proxy_(proxy), obj_(obj), data_(data) {}
+
+ D const& operator=(D const& value)
+ { return proxy_.template set<D, C>(obj_, data_, value); }
+ D& operator=(D& value)
+ { return proxy_.template set<D, C>(obj_, data_, value); }
+
+ operator D const&() const
+ { return proxy_.template get<D, C>(obj_, data_); }
+ operator D&()
+ { return proxy_.template get<D, C>(obj_, data_); }
+private:
+ Proxy& proxy_;
+ C* obj_;
+ data_ptr data_;
+};
+
+template<class Proxy, typename R, class C, typename A0>
+struct accessor<Proxy, R (C::*)(A0)> {
+ typedef C class_type;
+ typedef R (C::* func_ptr)(A0);
+ explicit accessor(Proxy& proxy, C* obj, func_ptr func)
+ : proxy_(proxy), obj_(obj), func_(func) {}
+
+ R operator()(A0 a0) const
+ { return proxy_.template call<R, C, A0>(obj_, func_, a0); }
+ R operator()(A0 a0)
+ { return proxy_.template call<R, C, A0>(obj_, func_, a0); }
+private:
+ Proxy& proxy_;
+ C* obj_;
+ func_ptr func_;
+};
+
+} // namespace
+
+template<class Class, class Proxy>
+struct proxy_ptr {
+ /* implicit */ proxy_ptr(Class* obj) : proxy_(), obj_(obj) {}
+ virtual ~proxy_ptr() { delete obj_; }
+
+ template<typename F>
+ proxy_ptr_aux::accessor<Proxy, F> operator->*(F func) {
+ typedef typename proxy_ptr_aux::accessor<Proxy, F>::class_type f_class;
+ BOOST_MPL_ASSERT_MSG((boost::is_same<Class, f_class>::value),
+ ERROR_expected_member_pointer_of_class, (Class));
+ // f_class* cast used to reduce verbosity of compiler errors (always
+ // safe because of static assertion above).
+ return proxy_ptr_aux::accessor<Proxy, F>(proxy_, (f_class*)obj_, func);
+ }
+
+private:
+ Proxy proxy_;
+ Class* obj_;
+};
+
+#endif // #include guard
+

Added: sandbox/closure/sep01.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/sep01.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,30 @@
+
+#include <separate.hpp>
+#include <vector>
+#include <cstdlib>
+#include <iostream>
+
+template<typename T, typename A = int>
+struct buf {
+ int x;
+
+ explicit buf(size_t count = 0) {
+ std::cout << "created with size " << count << std::endl;
+ }
+ void push_back(T const& value) {
+ std::cout << "pushed " << value << std::endl;
+ }
+};
+
+int main() {
+ SEPARATE_DECL(buf<int>, i)(3);
+ (SEPARATED(i)::push_back)(10);
+ SEPARATED(i)::x = 1;
+
+ typedef std::vector<int> vect_t;
+ separate_ptr<vect_t> vect = new vect_t(3);
+ (vect->*&vect_t::push_back)(123);
+
+ return EXIT_SUCCESS;
+}
+

Added: sandbox/closure/separate.hpp
==============================================================================
--- (empty file)
+++ sandbox/closure/separate.hpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,54 @@
+
+#ifndef SEPARATE_HPP_
+#define SEPARATE_HPP_
+
+#include <proxy.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <iostream>
+
+namespace separate { namespace aux {
+
+struct locker {
+ /** @todo IF R is non-void OR any Ai is a ref OR a ptr THEN lock, etc */
+
+ template<typename D, class C>
+ D const& set(C* obj, D C::* data, D const& value)
+ { return obj->*data = value; }
+ template<typename D, class C>
+ D& set(C* obj, D C::* data, D& value)
+ { return obj->*data = value; }
+
+ template<typename D, class C>
+ D const& get(C const* obj, D C::* data) { return obj->*data; }
+ template<typename D, class C>
+ D& get(C* obj, D C::* data) { return obj->*data; }
+
+ template<typename R, class C, typename A0>
+ R call(C const* obj, R (C::* func)(A0), A0 a0)
+ { return (obj->*func)(a0); }
+ template<typename R, class C, typename A0>
+ R call(C* obj, R (C::* func)(A0), A0 a0)
+ { return (obj->*func)(a0); }
+};
+
+}} // namespace
+
+template<class Class>
+struct separate_ptr : proxy_ptr<Class, separate::aux::locker> {
+ /* implicit */ separate_ptr(Class* obj)
+ : proxy_ptr<Class, separate::aux::locker>(obj) {}
+};
+
+#define SEPARATE_TYPEOF(obj) \
+ BOOST_PP_CAT(obj, Xtype)
+
+#define SEPARATE_DECL(type, obj) \
+ typedef type SEPARATE_TYPEOF(obj); \
+ ::separate_ptr< SEPARATE_TYPEOF(obj) > obj \
+ = new type
+
+#define SEPARATED(obj) \
+ obj->*&SEPARATE_TYPEOF(obj)
+
+#endif // #include guard
+

Added: sandbox/closure/separate_ptr.hpp
==============================================================================
--- (empty file)
+++ sandbox/closure/separate_ptr.hpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,54 @@
+
+#ifndef SEPARATE_HPP_
+#define SEPARATE_HPP_
+
+#include <proxy.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <iostream>
+
+namespace separate_ptr_aux {
+
+struct locker {
+ /** @todo IF R is non-void OR any Ai is a ref OR a ptr THEN lock, etc */
+
+ template<typename D, class C>
+ D const& set(C* obj, D C::* data, D const& value)
+ { return obj->*data = value; }
+ template<typename D, class C>
+ D& set(C* obj, D C::* data, D& value)
+ { return obj->*data = value; }
+
+ template<typename D, class C>
+ D const& get(C const* obj, D C::* data) { return obj->*data; }
+ template<typename D, class C>
+ D& get(C* obj, D C::* data) { return obj->*data; }
+
+ template<typename R, class C, typename A0>
+ R call(C const* obj, R (C::* func)(A0), A0 a0)
+ { return (obj->*func)(a0); }
+ template<typename R, class C, typename A0>
+ R call(C* obj, R (C::* func)(A0), A0 a0)
+ { return (obj->*func)(a0); }
+};
+
+} // namespace
+
+template<class Class>
+struct separate_ptr : proxy_ptr<Class, separate_ptr_aux::locker> {
+ /* implicit */ separate_ptr(Class* obj)
+ : proxy_ptr<Class, separate_ptr_aux::locker>(obj) {}
+};
+
+#define SEPARATE_TYPEOF(obj) \
+ BOOST_PP_CAT(obj, Xtype)
+
+#define SEPARATE(type, obj) \
+ typedef type SEPARATE_TYPEOF(obj); \
+ ::separate_ptr< SEPARATE_TYPEOF(obj) > obj \
+ /* = new ... */
+
+#define SEPARATED(obj) \
+ obj->*&SEPARATE_TYPEOF(obj)
+
+#endif // #include guard
+

Added: sandbox/closure/test_add.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/test_add.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,24 @@
+
+//[test_add_cpp
+#include <boost/closure.hpp>
+#define BOOST_TEST_MODULE TestAdd
+#include <boost/test/unit_test.hpp>
+#include <algorithm>
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE(test_add) {
+ int sum = 0, factor = 10;
+
+ void BOOST_CLOSURE(const bind factor, bind& sum, int num) {
+ sum += factor * num;
+ } BOOST_CLOSURE_END(add)
+
+ add(1); // Call the function closure.
+
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add); // Pass the closure to an algorithm.
+
+ BOOST_CHECK(sum == 60);
+}
+//]
+

Added: sandbox/closure/test_add_lambda.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/test_add_lambda.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,24 @@
+
+//[test_add_lambda_cpp
+#include <boost/closure.hpp>
+#define BOOST_TEST_MODULE TestAddLambda
+#include <boost/test/unit_test.hpp>
+#include <algorithm>
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE(test_add_lambda) {
+ int sum = 0, factor = 10;
+
+ auto add = [factor, &sum](int num) {
+ sum += factor * num;
+ };
+
+ add(1); // Call the lambda.
+
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add); // Pass the lambda to an algorithm.
+
+ BOOST_CHECK(sum == 60);
+}
+//]
+

Added: sandbox/closure/test_add_seq.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/test_add_seq.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,24 @@
+
+//[test_add_seq_cpp
+#include <boost/closure.hpp>
+#define BOOST_TEST_MODULE TestAddSeq
+#include <boost/test/unit_test.hpp>
+#include <algorithm>
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE(test_add_seq) {
+ int sum = 0, factor = 10;
+
+ void BOOST_CLOSURE( (const bind factor) (bind& sum) (int num) ) {
+ sum += factor * num;
+ } BOOST_CLOSURE_END(add)
+
+ add(1); // Call the function closure.
+
+ int nums[] = {2, 3};
+ std::for_each(nums, nums + 2, add); // Pass the closure to an algorithm.
+
+ BOOST_CHECK(sum == 60);
+}
+//]
+

Added: sandbox/closure/test_offset.cpp
==============================================================================
--- (empty file)
+++ sandbox/closure/test_offset.cpp 2012-01-17 10:28:55 EST (Tue, 17 Jan 2012)
@@ -0,0 +1,23 @@
+
+//[test_offset_cpp
+#include <iostream>
+#include <boost/closure.hpp>
+#include <boost/function.hpp>
+#include <cstdlib>
+
+/** @todo test returning closures with defaults, this binding, and recursion */
+
+boost::function<int (int)> offset(int delta) {
+ int BOOST_CLOSURE(bind delta, int x) { // Must not bind by reference.
+ std::cout << delta << std::endl;
+ return x + delta;
+ } BOOST_CLOSURE_END(add)
+ return add; // Return the function closure.
+}
+
+int main(void) {
+ boost::function<int (int)> offset10 = offset(10);
+ return (offset10(2) == 12) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+//]
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk