Bug#653256: clang: defines __GNUC__ but does not support all built-in functions
brian m. carlson
sandals at crustytoothpaste.net
Mon Dec 26 01:01:54 UTC 2011
Package: clang
Version: 3.0-5
Severity: normal
I have code that uses the new AES-NI instructions based on the
following:
#if defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
#if defined(__GNUC__) && defined(__AES__) && defined(__SSE4_1__)
#define FEATURE_AESNI
#endif
#endif
To do key setup, I use __builtin_ia32_vec_ext_v4si and
__builtin_ia32_vec_set_v4si. However, when I compile as follows:
clang++ -Iinclude -Iimpl/block/aes-native/ -Iimpl/block -DDREW_AS_MODULE -D_REENTRANT -D_THREAD_SAFE -Wall -Werror -fPIC -O3 -g -pipe -D_POSIX_SOURCE=200112L -D_XOPEN_SOURCE=600 -fextended-identifiers -floop-interchange -floop-block -fvisibility=hidden -fno-rtti -maes -msse4 -c -o impl/block/aes-native/aesni.o impl/block/aes-native/aesni.cc
I get errors due to clang not understanding __builtin_ia32_vec_ext_v4si:
In file included from impl/block/aes-native/aesni.cc:1:
impl/block/aes-native/aesni.cc:137:4: error: use of undeclared identifier '__builtin_ia32_vec_ext_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
impl/block/aes-native/aesni.cc:137:32: error: cannot initialize a parameter of type '__attribute__((__vector_size__(2 *
sizeof(int)))) int' with an rvalue of type 'vector4i_t'
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^~~~~~~~~~~~~~
impl/block/aes-native/aesni.cc:148:18: error: use of undeclared identifier '__builtin_ia32_vec_set_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^
impl/block/aes-native/aesni.cc:148:69: error: too many arguments to function call, expected 2, have 3
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
impl/block/aes-native/aesni.cc:151:18: error: use of undeclared identifier '__builtin_ia32_vec_set_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
t =(vector_t) __builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^
impl/block/aes-native/aesni.cc:151:69: error: too many arguments to function call, expected 2, have 3
t =(vector_t) __builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
impl/block/aes-native/aesni.cc:153:21: error: use of undeclared identifier '__builtin_ia32_vec_ext_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
rk[12] = rk[4] ^ __builtin_ia32_vec_ext_v4si(vector4i_t(t2), 2);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^
impl/block/aes-native/aesni.cc:153:49: error: cannot initialize a parameter of type '__attribute__((__vector_size__(2 *
sizeof(int)))) int' with an rvalue of type 'vector4i_t'
rk[12] = rk[4] ^ __builtin_ia32_vec_ext_v4si(vector4i_t(t2), 2);
^~~~~~~~~~~~~~
impl/block/aes-native/aesni.cc:157:18: error: use of undeclared identifier '__builtin_ia32_vec_set_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[15], 3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^
impl/block/aes-native/aesni.cc:157:69: error: too many arguments to function call, expected 2, have 3
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[15], 3);
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
impl/block/aes-native/aesni.cc:160:18: error: use of undeclared identifier '__builtin_ia32_vec_set_v4si'; did you mean
'__builtin_ia32_vec_ext_v2si'?
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[7], 3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
__builtin_ia32_vec_ext_v2si
impl/block/aes-native/aesni.cc:137:4: note: '__builtin_ia32_vec_ext_v2si' declared here
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
^
impl/block/aes-native/aesni.cc:160:68: error: too many arguments to function call, expected 2, have 3
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[7], 3);
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
12 errors generated.
Honestly, I think it's rather gross for clang to define __GNUC__, but I
don't have an objection if clang does in fact implement all the GCC
features, including all of the GCC built-in functions (more
specifically, if clang is indistinguishable from GCC). However, if it
does not, it must not define __GNUC__, because that breaks code. The
code in question is specifically designed to completely compile out if
any of those four conditions aren't met (e.g. on sparc, or on non-GCC),
and instead I get a compilation error. I'm not very happy about that.
Please fix this, preferably by no longer #defining __GNUC__, or
implement all the GCC builtins correctly.
I don't suspect preprocessed source will be especially useful here, but
some is attached.
-- System Information:
Debian Release: wheezy/sid
APT prefers unstable
APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 3.1.0-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages clang depends on:
ii libc6 2.13-23
ii libclang-common-dev 3.0-5
ii libffi5 3.0.10-3
ii libgcc1 1:4.7-20111217-2
ii libllvm3.0 3.0-5
ii libstdc++6 4.7-20111217-2
ii libstdc++6-4.6-dev 4.6.2-9
Versions of packages clang recommends:
ii llvm-3.0-dev 3.0-5
ii python 2.7.2-9
clang suggests no packages.
-- no debconf information
--
brian m. carlson / brian with sandals: Houston, Texas, US
+1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187
-------------- next part --------------
# 1 "impl/block/aes-native/aesni.cc"
# 1 "impl/block/aes-native/aesni.cc" 1
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 144 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "impl/block/aes-native/aesni.cc" 2
# 21 "impl/block/aes-native/aesni.cc"
# 1 "include/internal.h" 1
# 78 "include/internal.h"
typedef int (*drew_plugin_api_t)(void *, int, int, void *);
# 22 "impl/block/aes-native/aesni.cc" 2
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 323 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4
# 324 "/usr/include/features.h" 2 3 4
# 356 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 353 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 354 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 357 "/usr/include/features.h" 2 3 4
# 388 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 5 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 389 "/usr/include/features.h" 2 3 4
# 29 "/usr/include/stdio.h" 2 3 4
extern "C" {
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 31 "/usr/include/clang/3.0/include/stddef.h" 3 4
typedef __typeof__(((int*)0)-((int*)0)) ptrdiff_t;
typedef __typeof__(sizeof(int)) size_t;
# 35 "/usr/include/stdio.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 4
# 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 29 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
typedef long int __quad_t;
typedef unsigned long int __u_quad_t;
# 131 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/typesizes.h" 1 3 4
# 132 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
typedef unsigned long int __dev_t;
typedef unsigned int __uid_t;
typedef unsigned int __gid_t;
typedef unsigned long int __ino_t;
typedef unsigned long int __ino64_t;
typedef unsigned int __mode_t;
typedef unsigned long int __nlink_t;
typedef long int __off_t;
typedef long int __off64_t;
typedef int __pid_t;
typedef struct { int __val[2]; } __fsid_t;
typedef long int __clock_t;
typedef unsigned long int __rlim_t;
typedef unsigned long int __rlim64_t;
typedef unsigned int __id_t;
typedef long int __time_t;
typedef unsigned int __useconds_t;
typedef long int __suseconds_t;
typedef int __daddr_t;
typedef long int __swblk_t;
typedef int __key_t;
typedef int __clockid_t;
typedef void * __timer_t;
typedef long int __blksize_t;
typedef long int __blkcnt_t;
typedef long int __blkcnt64_t;
typedef unsigned long int __fsblkcnt_t;
typedef unsigned long int __fsblkcnt64_t;
typedef unsigned long int __fsfilcnt_t;
typedef unsigned long int __fsfilcnt64_t;
typedef long int __ssize_t;
typedef __off64_t __loff_t;
typedef __quad_t *__qaddr_t;
typedef char *__caddr_t;
typedef long int __intptr_t;
typedef unsigned int __socklen_t;
# 37 "/usr/include/stdio.h" 2 3 4
struct _IO_FILE;
typedef struct _IO_FILE FILE;
# 65 "/usr/include/stdio.h" 3 4
typedef struct _IO_FILE __FILE;
# 75 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/libio.h" 1 3 4
# 32 "/usr/include/libio.h" 3 4
# 1 "/usr/include/_G_config.h" 1 3 4
# 15 "/usr/include/_G_config.h" 3 4
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 16 "/usr/include/_G_config.h" 2 3 4
# 1 "/usr/include/wchar.h" 1 3 4
# 83 "/usr/include/wchar.h" 3 4
typedef struct
{
int __count;
union
{
unsigned int __wch;
char __wchb[4];
} __value;
} __mbstate_t;
# 21 "/usr/include/_G_config.h" 2 3 4
typedef struct
{
__off_t __pos;
__mbstate_t __state;
} _G_fpos_t;
typedef struct
{
__off64_t __pos;
__mbstate_t __state;
} _G_fpos64_t;
# 53 "/usr/include/_G_config.h" 3 4
typedef int _G_int16_t __attribute__ ((__mode__ (__HI__)));
typedef int _G_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__)));
# 33 "/usr/include/libio.h" 2 3 4
# 53 "/usr/include/libio.h" 3 4
# 1 "/usr/include/clang/3.0/include/stdarg.h" 1 3 4
# 30 "/usr/include/clang/3.0/include/stdarg.h" 3 4
typedef __builtin_va_list va_list;
# 48 "/usr/include/clang/3.0/include/stdarg.h" 3 4
typedef __builtin_va_list __gnuc_va_list;
# 54 "/usr/include/libio.h" 2 3 4
# 170 "/usr/include/libio.h" 3 4
struct _IO_jump_t; struct _IO_FILE;
# 180 "/usr/include/libio.h" 3 4
typedef void _IO_lock_t;
struct _IO_marker {
struct _IO_marker *_next;
struct _IO_FILE *_sbuf;
int _pos;
# 203 "/usr/include/libio.h" 3 4
};
enum __codecvt_result
{
__codecvt_ok,
__codecvt_partial,
__codecvt_error,
__codecvt_noconv
};
# 271 "/usr/include/libio.h" 3 4
struct _IO_FILE {
int _flags;
char* _IO_read_ptr;
char* _IO_read_end;
char* _IO_read_base;
char* _IO_write_base;
char* _IO_write_ptr;
char* _IO_write_end;
char* _IO_buf_base;
char* _IO_buf_end;
char *_IO_save_base;
char *_IO_backup_base;
char *_IO_save_end;
struct _IO_marker *_markers;
struct _IO_FILE *_chain;
int _fileno;
int _flags2;
__off_t _old_offset;
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[1];
_IO_lock_t *_lock;
# 319 "/usr/include/libio.h" 3 4
__off64_t _offset;
# 328 "/usr/include/libio.h" 3 4
void *__pad1;
void *__pad2;
void *__pad3;
void *__pad4;
size_t __pad5;
int _mode;
char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
};
struct _IO_FILE_plus;
extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
# 364 "/usr/include/libio.h" 3 4
typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
size_t __n);
typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
typedef int __io_close_fn (void *__cookie);
typedef __io_read_fn cookie_read_function_t;
typedef __io_write_fn cookie_write_function_t;
typedef __io_seek_fn cookie_seek_function_t;
typedef __io_close_fn cookie_close_function_t;
typedef struct
{
__io_read_fn *read;
__io_write_fn *write;
__io_seek_fn *seek;
__io_close_fn *close;
} _IO_cookie_io_functions_t;
typedef _IO_cookie_io_functions_t cookie_io_functions_t;
struct _IO_cookie_file;
extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
void *__cookie, _IO_cookie_io_functions_t __fns);
extern "C" {
extern int __underflow (_IO_FILE *);
extern int __uflow (_IO_FILE *);
extern int __overflow (_IO_FILE *, int);
# 460 "/usr/include/libio.h" 3 4
extern int _IO_getc (_IO_FILE *__fp);
extern int _IO_putc (int __c, _IO_FILE *__fp);
extern int _IO_feof (_IO_FILE *__fp) throw ();
extern int _IO_ferror (_IO_FILE *__fp) throw ();
extern int _IO_peekc_locked (_IO_FILE *__fp);
extern void _IO_flockfile (_IO_FILE *) throw ();
extern void _IO_funlockfile (_IO_FILE *) throw ();
extern int _IO_ftrylockfile (_IO_FILE *) throw ();
# 490 "/usr/include/libio.h" 3 4
extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
__gnuc_va_list, int *__restrict);
extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
__gnuc_va_list);
extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t);
extern size_t _IO_sgetn (_IO_FILE *, void *, size_t);
extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int);
extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int);
extern void _IO_free_backup_area (_IO_FILE *) throw ();
# 552 "/usr/include/libio.h" 3 4
}
# 76 "/usr/include/stdio.h" 2 3 4
typedef __gnuc_va_list va_list;
# 91 "/usr/include/stdio.h" 3 4
typedef __off_t off_t;
typedef __off64_t off64_t;
typedef __ssize_t ssize_t;
typedef _G_fpos_t fpos_t;
typedef _G_fpos64_t fpos64_t;
# 161 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h" 1 3 4
# 162 "/usr/include/stdio.h" 2 3 4
extern struct _IO_FILE *stdin;
extern struct _IO_FILE *stdout;
extern struct _IO_FILE *stderr;
extern int remove (__const char *__filename) throw ();
extern int rename (__const char *__old, __const char *__new) throw ();
extern int renameat (int __oldfd, __const char *__old, int __newfd,
__const char *__new) throw ();
# 192 "/usr/include/stdio.h" 3 4
extern FILE *tmpfile (void) ;
# 202 "/usr/include/stdio.h" 3 4
extern FILE *tmpfile64 (void) ;
extern char *tmpnam (char *__s) throw () ;
extern char *tmpnam_r (char *__s) throw () ;
# 224 "/usr/include/stdio.h" 3 4
extern char *tempnam (__const char *__dir, __const char *__pfx)
throw () __attribute__ ((__malloc__)) ;
# 234 "/usr/include/stdio.h" 3 4
extern int fclose (FILE *__stream);
extern int fflush (FILE *__stream);
# 249 "/usr/include/stdio.h" 3 4
extern int fflush_unlocked (FILE *__stream);
# 259 "/usr/include/stdio.h" 3 4
extern int fcloseall (void);
# 269 "/usr/include/stdio.h" 3 4
extern FILE *fopen (__const char *__restrict __filename,
__const char *__restrict __modes) ;
extern FILE *freopen (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream) ;
# 294 "/usr/include/stdio.h" 3 4
extern FILE *fopen64 (__const char *__restrict __filename,
__const char *__restrict __modes) ;
extern FILE *freopen64 (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream) ;
extern FILE *fdopen (int __fd, __const char *__modes) throw () ;
extern FILE *fopencookie (void *__restrict __magic_cookie,
__const char *__restrict __modes,
_IO_cookie_io_functions_t __io_funcs) throw () ;
extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes)
throw () ;
extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ;
extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw ();
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
int __modes, size_t __n) throw ();
extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
size_t __size) throw ();
extern void setlinebuf (FILE *__stream) throw ();
# 353 "/usr/include/stdio.h" 3 4
extern int fprintf (FILE *__restrict __stream,
__const char *__restrict __format, ...);
extern int printf (__const char *__restrict __format, ...);
extern int sprintf (char *__restrict __s,
__const char *__restrict __format, ...) throw ();
extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg);
extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg);
extern int vsprintf (char *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg) throw ();
extern int snprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, ...)
throw () __attribute__ ((__format__ (__printf__, 3, 4)));
extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, __gnuc_va_list __arg)
throw () __attribute__ ((__format__ (__printf__, 3, 0)));
extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f,
__gnuc_va_list __arg)
throw () __attribute__ ((__format__ (__printf__, 2, 0))) ;
extern int __asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
throw () __attribute__ ((__format__ (__printf__, 2, 3))) ;
extern int asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
throw () __attribute__ ((__format__ (__printf__, 2, 3))) ;
# 414 "/usr/include/stdio.h" 3 4
extern int vdprintf (int __fd, __const char *__restrict __fmt,
__gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 2, 0)));
extern int dprintf (int __fd, __const char *__restrict __fmt, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
# 427 "/usr/include/stdio.h" 3 4
extern int fscanf (FILE *__restrict __stream,
__const char *__restrict __format, ...) ;
extern int scanf (__const char *__restrict __format, ...) ;
extern int sscanf (__const char *__restrict __s,
__const char *__restrict __format, ...) throw ();
# 473 "/usr/include/stdio.h" 3 4
extern int vfscanf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg)
__attribute__ ((__format__ (__scanf__, 2, 0))) ;
extern int vscanf (__const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__scanf__, 1, 0))) ;
extern int vsscanf (__const char *__restrict __s,
__const char *__restrict __format, __gnuc_va_list __arg)
throw () __attribute__ ((__format__ (__scanf__, 2, 0)));
# 533 "/usr/include/stdio.h" 3 4
extern int fgetc (FILE *__stream);
extern int getc (FILE *__stream);
extern int getchar (void);
# 552 "/usr/include/stdio.h" 3 4
extern int getc_unlocked (FILE *__stream);
extern int getchar_unlocked (void);
# 563 "/usr/include/stdio.h" 3 4
extern int fgetc_unlocked (FILE *__stream);
# 575 "/usr/include/stdio.h" 3 4
extern int fputc (int __c, FILE *__stream);
extern int putc (int __c, FILE *__stream);
extern int putchar (int __c);
# 596 "/usr/include/stdio.h" 3 4
extern int fputc_unlocked (int __c, FILE *__stream);
extern int putc_unlocked (int __c, FILE *__stream);
extern int putchar_unlocked (int __c);
extern int getw (FILE *__stream);
extern int putw (int __w, FILE *__stream);
# 624 "/usr/include/stdio.h" 3 4
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
;
extern char *gets (char *__s) ;
# 642 "/usr/include/stdio.h" 3 4
extern char *fgets_unlocked (char *__restrict __s, int __n,
FILE *__restrict __stream) ;
# 658 "/usr/include/stdio.h" 3 4
extern __ssize_t __getdelim (char **__restrict __lineptr,
size_t *__restrict __n, int __delimiter,
FILE *__restrict __stream) ;
extern __ssize_t getdelim (char **__restrict __lineptr,
size_t *__restrict __n, int __delimiter,
FILE *__restrict __stream) ;
extern __ssize_t getline (char **__restrict __lineptr,
size_t *__restrict __n,
FILE *__restrict __stream) ;
# 682 "/usr/include/stdio.h" 3 4
extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);
extern int puts (__const char *__s);
extern int ungetc (int __c, FILE *__stream);
extern size_t fread (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream) ;
extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __s);
# 719 "/usr/include/stdio.h" 3 4
extern int fputs_unlocked (__const char *__restrict __s,
FILE *__restrict __stream);
# 730 "/usr/include/stdio.h" 3 4
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream) ;
extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size,
size_t __n, FILE *__restrict __stream);
# 742 "/usr/include/stdio.h" 3 4
extern int fseek (FILE *__stream, long int __off, int __whence);
extern long int ftell (FILE *__stream) ;
extern void rewind (FILE *__stream);
# 766 "/usr/include/stdio.h" 3 4
extern int fseeko (FILE *__stream, __off_t __off, int __whence);
extern __off_t ftello (FILE *__stream) ;
# 791 "/usr/include/stdio.h" 3 4
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
extern int fsetpos (FILE *__stream, __const fpos_t *__pos);
# 811 "/usr/include/stdio.h" 3 4
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);
extern __off64_t ftello64 (FILE *__stream) ;
extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos);
extern int fsetpos64 (FILE *__stream, __const fpos64_t *__pos);
extern void clearerr (FILE *__stream) throw ();
extern int feof (FILE *__stream) throw () ;
extern int ferror (FILE *__stream) throw () ;
extern void clearerr_unlocked (FILE *__stream) throw ();
extern int feof_unlocked (FILE *__stream) throw () ;
extern int ferror_unlocked (FILE *__stream) throw () ;
# 839 "/usr/include/stdio.h" 3 4
extern void perror (__const char *__s);
# 1 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 1 3 4
# 27 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 3 4
extern int sys_nerr;
extern __const char *__const sys_errlist[];
extern int _sys_nerr;
extern __const char *__const _sys_errlist[];
# 847 "/usr/include/stdio.h" 2 3 4
extern int fileno (FILE *__stream) throw () ;
extern int fileno_unlocked (FILE *__stream) throw () ;
# 866 "/usr/include/stdio.h" 3 4
extern FILE *popen (__const char *__command, __const char *__modes) ;
extern int pclose (FILE *__stream);
extern char *ctermid (char *__s) throw ();
extern char *cuserid (char *__s);
struct obstack;
extern int obstack_printf (struct obstack *__restrict __obstack,
__const char *__restrict __format, ...)
throw () __attribute__ ((__format__ (__printf__, 2, 3)));
extern int obstack_vprintf (struct obstack *__restrict __obstack,
__const char *__restrict __format,
__gnuc_va_list __args)
throw () __attribute__ ((__format__ (__printf__, 2, 0)));
extern void flockfile (FILE *__stream) throw ();
extern int ftrylockfile (FILE *__stream) throw () ;
extern void funlockfile (FILE *__stream) throw ();
# 936 "/usr/include/stdio.h" 3 4
}
# 24 "impl/block/aes-native/aesni.cc" 2
# 1 "/usr/include/stdlib.h" 1 3 4
# 33 "/usr/include/stdlib.h" 3 4
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 34 "/usr/include/stdlib.h" 2 3 4
extern "C" {
# 1 "/usr/include/x86_64-linux-gnu/bits/waitflags.h" 1 3 4
# 43 "/usr/include/stdlib.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/waitstatus.h" 1 3 4
# 65 "/usr/include/x86_64-linux-gnu/bits/waitstatus.h" 3 4
# 1 "/usr/include/endian.h" 1 3 4
# 37 "/usr/include/endian.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/endian.h" 1 3 4
# 38 "/usr/include/endian.h" 2 3 4
# 61 "/usr/include/endian.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 1 3 4
# 28 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 29 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 2 3 4
# 62 "/usr/include/endian.h" 2 3 4
# 66 "/usr/include/x86_64-linux-gnu/bits/waitstatus.h" 2 3 4
union wait
{
int w_status;
struct
{
unsigned int __w_termsig:7;
unsigned int __w_coredump:1;
unsigned int __w_retcode:8;
unsigned int:16;
} __wait_terminated;
struct
{
unsigned int __w_stopval:8;
unsigned int __w_stopsig:8;
unsigned int:16;
} __wait_stopped;
};
# 44 "/usr/include/stdlib.h" 2 3 4
# 98 "/usr/include/stdlib.h" 3 4
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long int quot;
long int rem;
} ldiv_t;
__extension__ typedef struct
{
long long int quot;
long long int rem;
} lldiv_t;
# 140 "/usr/include/stdlib.h" 3 4
extern size_t __ctype_get_mb_cur_max (void) throw () ;
extern double atof (__const char *__nptr)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
extern int atoi (__const char *__nptr)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
extern long int atol (__const char *__nptr)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
__extension__ extern long long int atoll (__const char *__nptr)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
extern double strtod (__const char *__restrict __nptr,
char **__restrict __endptr)
throw () __attribute__ ((__nonnull__ (1))) ;
extern float strtof (__const char *__restrict __nptr,
char **__restrict __endptr) throw () __attribute__ ((__nonnull__ (1))) ;
extern long double strtold (__const char *__restrict __nptr,
char **__restrict __endptr)
throw () __attribute__ ((__nonnull__ (1))) ;
extern long int strtol (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
extern unsigned long int strtoul (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
__extension__
extern long long int strtoq (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
__extension__
extern unsigned long long int strtouq (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
__extension__
extern long long int strtoll (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
__extension__
extern unsigned long long int strtoull (__const char *__restrict __nptr,
char **__restrict __endptr, int __base)
throw () __attribute__ ((__nonnull__ (1))) ;
# 236 "/usr/include/stdlib.h" 3 4
# 1 "/usr/include/xlocale.h" 1 3 4
# 28 "/usr/include/xlocale.h" 3 4
typedef struct __locale_struct
{
struct __locale_data *__locales[13];
const unsigned short int *__ctype_b;
const int *__ctype_tolower;
const int *__ctype_toupper;
const char *__names[13];
} *__locale_t;
typedef __locale_t locale_t;
# 237 "/usr/include/stdlib.h" 2 3 4
extern long int strtol_l (__const char *__restrict __nptr,
char **__restrict __endptr, int __base,
__locale_t __loc) throw () __attribute__ ((__nonnull__ (1, 4))) ;
extern unsigned long int strtoul_l (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, __locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 4))) ;
__extension__
extern long long int strtoll_l (__const char *__restrict __nptr,
char **__restrict __endptr, int __base,
__locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 4))) ;
__extension__
extern unsigned long long int strtoull_l (__const char *__restrict __nptr,
char **__restrict __endptr,
int __base, __locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 4))) ;
extern double strtod_l (__const char *__restrict __nptr,
char **__restrict __endptr, __locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 3))) ;
extern float strtof_l (__const char *__restrict __nptr,
char **__restrict __endptr, __locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 3))) ;
extern long double strtold_l (__const char *__restrict __nptr,
char **__restrict __endptr,
__locale_t __loc)
throw () __attribute__ ((__nonnull__ (1, 3))) ;
# 311 "/usr/include/stdlib.h" 3 4
extern char *l64a (long int __n) throw () ;
extern long int a64l (__const char *__s)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
# 1 "/usr/include/x86_64-linux-gnu/sys/types.h" 1 3 4
# 28 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
extern "C" {
typedef __u_char u_char;
typedef __u_short u_short;
typedef __u_int u_int;
typedef __u_long u_long;
typedef __quad_t quad_t;
typedef __u_quad_t u_quad_t;
typedef __fsid_t fsid_t;
typedef __loff_t loff_t;
typedef __ino_t ino_t;
typedef __ino64_t ino64_t;
typedef __dev_t dev_t;
typedef __gid_t gid_t;
typedef __mode_t mode_t;
typedef __nlink_t nlink_t;
typedef __uid_t uid_t;
# 99 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
typedef __pid_t pid_t;
typedef __id_t id_t;
# 116 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
typedef __daddr_t daddr_t;
typedef __caddr_t caddr_t;
typedef __key_t key_t;
# 133 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
# 1 "/usr/include/time.h" 1 3 4
# 60 "/usr/include/time.h" 3 4
typedef __clock_t clock_t;
# 76 "/usr/include/time.h" 3 4
typedef __time_t time_t;
# 92 "/usr/include/time.h" 3 4
typedef __clockid_t clockid_t;
# 104 "/usr/include/time.h" 3 4
typedef __timer_t timer_t;
# 134 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
typedef __useconds_t useconds_t;
typedef __suseconds_t suseconds_t;
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 148 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned int uint;
# 195 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
typedef int int8_t __attribute__ ((__mode__ (__QI__)));
typedef int int16_t __attribute__ ((__mode__ (__HI__)));
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
typedef int int64_t __attribute__ ((__mode__ (__DI__)));
typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));
typedef int register_t __attribute__ ((__mode__ (__word__)));
# 220 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/select.h" 1 3 4
# 31 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/select.h" 1 3 4
# 23 "/usr/include/x86_64-linux-gnu/bits/select.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 24 "/usr/include/x86_64-linux-gnu/bits/select.h" 2 3 4
# 32 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 1 3 4
# 24 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 3 4
typedef int __sig_atomic_t;
typedef struct
{
unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
} __sigset_t;
# 35 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
typedef __sigset_t sigset_t;
# 1 "/usr/include/time.h" 1 3 4
# 120 "/usr/include/time.h" 3 4
struct timespec
{
__time_t tv_sec;
long int tv_nsec;
};
# 45 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/time.h" 1 3 4
# 75 "/usr/include/x86_64-linux-gnu/bits/time.h" 3 4
struct timeval
{
__time_t tv_sec;
__suseconds_t tv_usec;
};
# 47 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
typedef long int __fd_mask;
# 67 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
typedef struct
{
__fd_mask fds_bits[1024 / (8 * (int) sizeof (__fd_mask))];
} fd_set;
typedef __fd_mask fd_mask;
# 99 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
extern "C" {
# 109 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
extern int select (int __nfds, fd_set *__restrict __readfds,
fd_set *__restrict __writefds,
fd_set *__restrict __exceptfds,
struct timeval *__restrict __timeout);
# 121 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
extern int pselect (int __nfds, fd_set *__restrict __readfds,
fd_set *__restrict __writefds,
fd_set *__restrict __exceptfds,
const struct timespec *__restrict __timeout,
const __sigset_t *__restrict __sigmask);
}
# 221 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/sysmacros.h" 1 3 4
# 30 "/usr/include/x86_64-linux-gnu/sys/sysmacros.h" 3 4
__extension__
extern unsigned int gnu_dev_major (unsigned long long int __dev)
throw ();
__extension__
extern unsigned int gnu_dev_minor (unsigned long long int __dev)
throw ();
__extension__
extern unsigned long long int gnu_dev_makedev (unsigned int __major,
unsigned int __minor)
throw ();
# 224 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
typedef __blksize_t blksize_t;
typedef __blkcnt_t blkcnt_t;
typedef __fsblkcnt_t fsblkcnt_t;
typedef __fsfilcnt_t fsfilcnt_t;
# 263 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
typedef __blkcnt64_t blkcnt64_t;
typedef __fsblkcnt64_t fsblkcnt64_t;
typedef __fsfilcnt64_t fsfilcnt64_t;
# 1 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 1 3 4
# 23 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 24 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 2 3 4
# 50 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
typedef unsigned long int pthread_t;
typedef union
{
char __size[56];
long int __align;
} pthread_attr_t;
typedef struct __pthread_internal_list
{
struct __pthread_internal_list *__prev;
struct __pthread_internal_list *__next;
} __pthread_list_t;
# 76 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
typedef union
{
struct __pthread_mutex_s
{
int __lock;
unsigned int __count;
int __owner;
unsigned int __nusers;
int __kind;
int __spins;
__pthread_list_t __list;
# 101 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
} __data;
char __size[40];
long int __align;
} pthread_mutex_t;
typedef union
{
char __size[4];
int __align;
} pthread_mutexattr_t;
typedef union
{
struct
{
int __lock;
unsigned int __futex;
__extension__ unsigned long long int __total_seq;
__extension__ unsigned long long int __wakeup_seq;
__extension__ unsigned long long int __woken_seq;
void *__mutex;
unsigned int __nwaiters;
unsigned int __broadcast_seq;
} __data;
char __size[48];
__extension__ long long int __align;
} pthread_cond_t;
typedef union
{
char __size[4];
int __align;
} pthread_condattr_t;
typedef unsigned int pthread_key_t;
typedef int pthread_once_t;
typedef union
{
struct
{
int __lock;
unsigned int __nr_readers;
unsigned int __readers_wakeup;
unsigned int __writer_wakeup;
unsigned int __nr_readers_queued;
unsigned int __nr_writers_queued;
int __writer;
int __shared;
unsigned long int __pad1;
unsigned long int __pad2;
unsigned int __flags;
} __data;
# 187 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
char __size[56];
long int __align;
} pthread_rwlock_t;
typedef union
{
char __size[8];
long int __align;
} pthread_rwlockattr_t;
typedef volatile int pthread_spinlock_t;
typedef union
{
char __size[32];
long int __align;
} pthread_barrier_t;
typedef union
{
char __size[4];
int __align;
} pthread_barrierattr_t;
# 272 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
}
# 321 "/usr/include/stdlib.h" 2 3 4
extern long int random (void) throw ();
extern void srandom (unsigned int __seed) throw ();
extern char *initstate (unsigned int __seed, char *__statebuf,
size_t __statelen) throw () __attribute__ ((__nonnull__ (2)));
extern char *setstate (char *__statebuf) throw () __attribute__ ((__nonnull__ (1)));
struct random_data
{
int32_t *fptr;
int32_t *rptr;
int32_t *state;
int rand_type;
int rand_deg;
int rand_sep;
int32_t *end_ptr;
};
extern int random_r (struct random_data *__restrict __buf,
int32_t *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int srandom_r (unsigned int __seed, struct random_data *__buf)
throw () __attribute__ ((__nonnull__ (2)));
extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
size_t __statelen,
struct random_data *__restrict __buf)
throw () __attribute__ ((__nonnull__ (2, 4)));
extern int setstate_r (char *__restrict __statebuf,
struct random_data *__restrict __buf)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int rand (void) throw ();
extern void srand (unsigned int __seed) throw ();
extern int rand_r (unsigned int *__seed) throw ();
extern double drand48 (void) throw ();
extern double erand48 (unsigned short int __xsubi[3]) throw () __attribute__ ((__nonnull__ (1)));
extern long int lrand48 (void) throw ();
extern long int nrand48 (unsigned short int __xsubi[3])
throw () __attribute__ ((__nonnull__ (1)));
extern long int mrand48 (void) throw ();
extern long int jrand48 (unsigned short int __xsubi[3])
throw () __attribute__ ((__nonnull__ (1)));
extern void srand48 (long int __seedval) throw ();
extern unsigned short int *seed48 (unsigned short int __seed16v[3])
throw () __attribute__ ((__nonnull__ (1)));
extern void lcong48 (unsigned short int __param[7]) throw () __attribute__ ((__nonnull__ (1)));
struct drand48_data
{
unsigned short int __x[3];
unsigned short int __old_x[3];
unsigned short int __c;
unsigned short int __init;
unsigned long long int __a;
};
extern int drand48_r (struct drand48_data *__restrict __buffer,
double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int erand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int lrand48_r (struct drand48_data *__restrict __buffer,
long int *__restrict __result)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int nrand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
long int *__restrict __result)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int mrand48_r (struct drand48_data *__restrict __buffer,
long int *__restrict __result)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int jrand48_r (unsigned short int __xsubi[3],
struct drand48_data *__restrict __buffer,
long int *__restrict __result)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
throw () __attribute__ ((__nonnull__ (2)));
extern int seed48_r (unsigned short int __seed16v[3],
struct drand48_data *__buffer) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int lcong48_r (unsigned short int __param[7],
struct drand48_data *__buffer)
throw () __attribute__ ((__nonnull__ (1, 2)));
# 471 "/usr/include/stdlib.h" 3 4
extern void *malloc (size_t __size) throw () __attribute__ ((__malloc__)) ;
extern void *calloc (size_t __nmemb, size_t __size)
throw () __attribute__ ((__malloc__)) ;
# 485 "/usr/include/stdlib.h" 3 4
extern void *realloc (void *__ptr, size_t __size)
throw () __attribute__ ((__warn_unused_result__));
extern void free (void *__ptr) throw ();
extern void cfree (void *__ptr) throw ();
# 1 "/usr/include/alloca.h" 1 3 4
# 25 "/usr/include/alloca.h" 3 4
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 26 "/usr/include/alloca.h" 2 3 4
extern "C" {
extern void *alloca (size_t __size) throw ();
}
# 498 "/usr/include/stdlib.h" 2 3 4
extern void *valloc (size_t __size) throw () __attribute__ ((__malloc__)) ;
extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
throw () __attribute__ ((__nonnull__ (1))) ;
extern void abort (void) throw () __attribute__ ((__noreturn__));
extern int atexit (void (*__func) (void)) throw () __attribute__ ((__nonnull__ (1)));
extern "C++" int at_quick_exit (void (*__func) (void))
throw () __asm ("at_quick_exit") __attribute__ ((__nonnull__ (1)));
# 536 "/usr/include/stdlib.h" 3 4
extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
throw () __attribute__ ((__nonnull__ (1)));
extern void exit (int __status) throw () __attribute__ ((__noreturn__));
extern void quick_exit (int __status) throw () __attribute__ ((__noreturn__));
extern void _Exit (int __status) throw () __attribute__ ((__noreturn__));
extern char *getenv (__const char *__name) throw () __attribute__ ((__nonnull__ (1))) ;
extern char *__secure_getenv (__const char *__name)
throw () __attribute__ ((__nonnull__ (1))) ;
extern int putenv (char *__string) throw () __attribute__ ((__nonnull__ (1)));
extern int setenv (__const char *__name, __const char *__value, int __replace)
throw () __attribute__ ((__nonnull__ (2)));
extern int unsetenv (__const char *__name) throw () __attribute__ ((__nonnull__ (1)));
extern int clearenv (void) throw ();
# 606 "/usr/include/stdlib.h" 3 4
extern char *mktemp (char *__template) throw () __attribute__ ((__nonnull__ (1))) ;
# 620 "/usr/include/stdlib.h" 3 4
extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1))) ;
# 630 "/usr/include/stdlib.h" 3 4
extern int mkstemp64 (char *__template) __attribute__ ((__nonnull__ (1))) ;
# 642 "/usr/include/stdlib.h" 3 4
extern int mkstemps (char *__template, int __suffixlen) __attribute__ ((__nonnull__ (1))) ;
# 652 "/usr/include/stdlib.h" 3 4
extern int mkstemps64 (char *__template, int __suffixlen)
__attribute__ ((__nonnull__ (1))) ;
# 663 "/usr/include/stdlib.h" 3 4
extern char *mkdtemp (char *__template) throw () __attribute__ ((__nonnull__ (1))) ;
# 674 "/usr/include/stdlib.h" 3 4
extern int mkostemp (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ;
# 684 "/usr/include/stdlib.h" 3 4
extern int mkostemp64 (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ;
# 694 "/usr/include/stdlib.h" 3 4
extern int mkostemps (char *__template, int __suffixlen, int __flags)
__attribute__ ((__nonnull__ (1))) ;
# 706 "/usr/include/stdlib.h" 3 4
extern int mkostemps64 (char *__template, int __suffixlen, int __flags)
__attribute__ ((__nonnull__ (1))) ;
# 717 "/usr/include/stdlib.h" 3 4
extern int system (__const char *__command) ;
extern char *canonicalize_file_name (__const char *__name)
throw () __attribute__ ((__nonnull__ (1))) ;
# 734 "/usr/include/stdlib.h" 3 4
extern char *realpath (__const char *__restrict __name,
char *__restrict __resolved) throw () ;
typedef int (*__compar_fn_t) (__const void *, __const void *);
typedef __compar_fn_t comparison_fn_t;
typedef int (*__compar_d_fn_t) (__const void *, __const void *, void *);
extern void *bsearch (__const void *__key, __const void *__base,
size_t __nmemb, size_t __size, __compar_fn_t __compar)
__attribute__ ((__nonnull__ (1, 2, 5))) ;
extern void qsort (void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4)));
extern void qsort_r (void *__base, size_t __nmemb, size_t __size,
__compar_d_fn_t __compar, void *__arg)
__attribute__ ((__nonnull__ (1, 4)));
extern int abs (int __x) throw () __attribute__ ((__const__)) ;
extern long int labs (long int __x) throw () __attribute__ ((__const__)) ;
__extension__ extern long long int llabs (long long int __x)
throw () __attribute__ ((__const__)) ;
extern div_t div (int __numer, int __denom)
throw () __attribute__ ((__const__)) ;
extern ldiv_t ldiv (long int __numer, long int __denom)
throw () __attribute__ ((__const__)) ;
__extension__ extern lldiv_t lldiv (long long int __numer,
long long int __denom)
throw () __attribute__ ((__const__)) ;
# 808 "/usr/include/stdlib.h" 3 4
extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *gcvt (double __value, int __ndigit, char *__buf)
throw () __attribute__ ((__nonnull__ (3))) ;
extern char *qecvt (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign)
throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *qfcvt (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign)
throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *qgcvt (long double __value, int __ndigit, char *__buf)
throw () __attribute__ ((__nonnull__ (3))) ;
extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign, char *__restrict __buf,
size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign, char *__restrict __buf,
size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int qecvt_r (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign,
char *__restrict __buf, size_t __len)
throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int qfcvt_r (long double __value, int __ndigit,
int *__restrict __decpt, int *__restrict __sign,
char *__restrict __buf, size_t __len)
throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int mblen (__const char *__s, size_t __n) throw () ;
extern int mbtowc (wchar_t *__restrict __pwc,
__const char *__restrict __s, size_t __n) throw () ;
extern int wctomb (char *__s, wchar_t __wchar) throw () ;
extern size_t mbstowcs (wchar_t *__restrict __pwcs,
__const char *__restrict __s, size_t __n) throw ();
extern size_t wcstombs (char *__restrict __s,
__const wchar_t *__restrict __pwcs, size_t __n)
throw ();
# 885 "/usr/include/stdlib.h" 3 4
extern int rpmatch (__const char *__response) throw () __attribute__ ((__nonnull__ (1))) ;
# 896 "/usr/include/stdlib.h" 3 4
extern int getsubopt (char **__restrict __optionp,
char *__const *__restrict __tokens,
char **__restrict __valuep)
throw () __attribute__ ((__nonnull__ (1, 2, 3))) ;
extern void setkey (__const char *__key) throw () __attribute__ ((__nonnull__ (1)));
extern int posix_openpt (int __oflag) ;
extern int grantpt (int __fd) throw ();
extern int unlockpt (int __fd) throw ();
extern char *ptsname (int __fd) throw () ;
extern int ptsname_r (int __fd, char *__buf, size_t __buflen)
throw () __attribute__ ((__nonnull__ (2)));
extern int getpt (void);
extern int getloadavg (double __loadavg[], int __nelem)
throw () __attribute__ ((__nonnull__ (1)));
# 964 "/usr/include/stdlib.h" 3 4
}
# 25 "impl/block/aes-native/aesni.cc" 2
# 1 "/usr/include/string.h" 1 3 4
# 29 "/usr/include/string.h" 3 4
extern "C" {
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 35 "/usr/include/string.h" 2 3 4
# 44 "/usr/include/string.h" 3 4
extern void *memcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern void *memmove (void *__dest, __const void *__src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
int __c, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern void *memset (void *__s, int __c, size_t __n) throw () __attribute__ ((__nonnull__ (1)));
extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 95 "/usr/include/string.h" 3 4
extern void *memchr (__const void *__s, int __c, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 109 "/usr/include/string.h" 3 4
extern void *rawmemchr (__const void *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 120 "/usr/include/string.h" 3 4
extern void *memrchr (__const void *__s, int __c, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *strncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
size_t __n) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int strcmp (__const char *__s1, __const char *__s2)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern int strcoll (__const char *__s1, __const char *__s2)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern size_t strxfrm (char *__restrict __dest,
__const char *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (2)));
# 165 "/usr/include/string.h" 3 4
extern int strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));
extern size_t strxfrm_l (char *__dest, __const char *__src, size_t __n,
__locale_t __l) throw () __attribute__ ((__nonnull__ (2, 4)));
extern char *strdup (__const char *__s)
throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
extern char *strndup (__const char *__string, size_t __n)
throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
# 235 "/usr/include/string.h" 3 4
extern char *strchr (__const char *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 262 "/usr/include/string.h" 3 4
extern char *strrchr (__const char *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 276 "/usr/include/string.h" 3 4
extern char *strchrnul (__const char *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
extern size_t strcspn (__const char *__s, __const char *__reject)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern size_t strspn (__const char *__s, __const char *__accept)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 314 "/usr/include/string.h" 3 4
extern char *strpbrk (__const char *__s, __const char *__accept)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 342 "/usr/include/string.h" 3 4
extern char *strstr (__const char *__haystack, __const char *__needle)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
throw () __attribute__ ((__nonnull__ (2)));
extern char *__strtok_r (char *__restrict __s,
__const char *__restrict __delim,
char **__restrict __save_ptr)
throw () __attribute__ ((__nonnull__ (2, 3)));
extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
char **__restrict __save_ptr)
throw () __attribute__ ((__nonnull__ (2, 3)));
# 373 "/usr/include/string.h" 3 4
extern char *strcasestr (__const char *__haystack, __const char *__needle)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern void *memmem (__const void *__haystack, size_t __haystacklen,
__const void *__needle, size_t __needlelen)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 3)));
extern void *__mempcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern void *mempcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern size_t strlen (__const char *__s)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
extern size_t strnlen (__const char *__string, size_t __maxlen)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
extern char *strerror (int __errnum) throw ();
# 438 "/usr/include/string.h" 3 4
extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
throw () __attribute__ ((__nonnull__ (2)));
extern char *strerror_l (int __errnum, __locale_t __l) throw ();
extern void __bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));
extern void bcopy (__const void *__src, void *__dest, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern void bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));
extern int bcmp (__const void *__s1, __const void *__s2, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 489 "/usr/include/string.h" 3 4
extern char *index (__const char *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 517 "/usr/include/string.h" 3 4
extern char *rindex (__const char *__s, int __c)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
extern int ffs (int __i) throw () __attribute__ ((__const__));
extern int ffsl (long int __l) throw () __attribute__ ((__const__));
__extension__ extern int ffsll (long long int __ll)
throw () __attribute__ ((__const__));
extern int strcasecmp (__const char *__s1, __const char *__s2)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern int strcasecmp_l (__const char *__s1, __const char *__s2,
__locale_t __loc)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));
extern int strncasecmp_l (__const char *__s1, __const char *__s2,
size_t __n, __locale_t __loc)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 4)));
extern char *strsep (char **__restrict __stringp,
__const char *__restrict __delim)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *strsignal (int __sig) throw ();
extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *__stpncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *stpncpy (char *__restrict __dest,
__const char *__restrict __src, size_t __n)
throw () __attribute__ ((__nonnull__ (1, 2)));
extern int strverscmp (__const char *__s1, __const char *__s2)
throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
extern char *strfry (char *__string) throw () __attribute__ ((__nonnull__ (1)));
extern void *memfrob (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));
# 606 "/usr/include/string.h" 3 4
extern char *basename (__const char *__filename) throw () __attribute__ ((__nonnull__ (1)));
# 646 "/usr/include/string.h" 3 4
}
# 26 "impl/block/aes-native/aesni.cc" 2
# 1 "/usr/include/c++/4.6/algorithm" 1 3
# 59 "/usr/include/c++/4.6/algorithm" 3
# 59 "/usr/include/c++/4.6/algorithm" 3
# 1 "/usr/include/c++/4.6/utility" 1 3
# 59 "/usr/include/c++/4.6/utility" 3
# 59 "/usr/include/c++/4.6/utility" 3
# 68 "/usr/include/c++/4.6/utility" 3
# 1 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/c++config.h" 1 3
# 153 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/c++config.h" 3
namespace std
{
typedef long unsigned int size_t;
typedef long int ptrdiff_t;
}
# 393 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/c++config.h" 3
# 1 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/os_defines.h" 1 3
# 394 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/c++config.h" 2 3
# 1 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/cpu_defines.h" 1 3
# 397 "/usr/include/c++/4.6/x86_64-linux-gnu/bits/c++config.h" 2 3
# 69 "/usr/include/c++/4.6/utility" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_relops.h" 1 3
# 68 "/usr/include/c++/4.6/bits/stl_relops.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
namespace rel_ops
{
# 86 "/usr/include/c++/4.6/bits/stl_relops.h" 3
template <class _Tp>
inline bool
operator!=(const _Tp& __x, const _Tp& __y)
{ return !(__x == __y); }
# 99 "/usr/include/c++/4.6/bits/stl_relops.h" 3
template <class _Tp>
inline bool
operator>(const _Tp& __x, const _Tp& __y)
{ return __y < __x; }
# 112 "/usr/include/c++/4.6/bits/stl_relops.h" 3
template <class _Tp>
inline bool
operator<=(const _Tp& __x, const _Tp& __y)
{ return !(__y < __x); }
# 125 "/usr/include/c++/4.6/bits/stl_relops.h" 3
template <class _Tp>
inline bool
operator>=(const _Tp& __x, const _Tp& __y)
{ return !(__x < __y); }
}
}
# 70 "/usr/include/c++/4.6/utility" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_pair.h" 1 3
# 60 "/usr/include/c++/4.6/bits/stl_pair.h" 3
# 1 "/usr/include/c++/4.6/bits/move.h" 1 3
# 34 "/usr/include/c++/4.6/bits/move.h" 3
# 1 "/usr/include/c++/4.6/bits/concept_check.h" 1 3
# 33 "/usr/include/c++/4.6/bits/concept_check.h" 3
# 33 "/usr/include/c++/4.6/bits/concept_check.h" 3
# 35 "/usr/include/c++/4.6/bits/move.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
template<typename _Tp>
inline _Tp*
__addressof(_Tp& __r)
{
return reinterpret_cast<_Tp*>
(&const_cast<char&>(reinterpret_cast<const volatile char&>(__r)));
}
}
# 109 "/usr/include/c++/4.6/bits/move.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 120 "/usr/include/c++/4.6/bits/move.h" 3
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]);
}
}
# 61 "/usr/include/c++/4.6/bits/stl_pair.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 86 "/usr/include/c++/4.6/bits/stl_pair.h" 3
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) { }
# 196 "/usr/include/c++/4.6/bits/stl_pair.h" 3
};
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); }
# 270 "/usr/include/c++/4.6/bits/stl_pair.h" 3
template<class _T1, class _T2>
inline pair<_T1, _T2>
make_pair(_T1 __x, _T2 __y)
{ return pair<_T1, _T2>(__x, __y); }
}
# 71 "/usr/include/c++/4.6/utility" 2 3
# 61 "/usr/include/c++/4.6/algorithm" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_algobase.h" 1 3
# 61 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
# 1 "/usr/include/c++/4.6/bits/functexcept.h" 1 3
# 41 "/usr/include/c++/4.6/bits/functexcept.h" 3
# 1 "/usr/include/c++/4.6/bits/exception_defines.h" 1 3
# 42 "/usr/include/c++/4.6/bits/functexcept.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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__));
}
# 62 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 1 3
# 36 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 3
# 36 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 3
# 68 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
template<typename _Iterator, typename _Container>
class __normal_iterator;
}
namespace std __attribute__ ((__visibility__ ("default")))
{
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;
};
# 198 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 3
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;
};
# 422 "/usr/include/c++/4.6/bits/cpp_type_traits.h" 3
}
# 63 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/ext/type_traits.h" 1 3
# 32 "/usr/include/c++/4.6/ext/type_traits.h" 3
# 32 "/usr/include/c++/4.6/ext/type_traits.h" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
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;
};
}
# 64 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/ext/numeric_traits.h" 1 3
# 32 "/usr/include/c++/4.6/ext/numeric_traits.h" 3
# 32 "/usr/include/c++/4.6/ext/numeric_traits.h" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
# 53 "/usr/include/c++/4.6/ext/numeric_traits.h" 3
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;
# 98 "/usr/include/c++/4.6/ext/numeric_traits.h" 3
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) * 643L / 2136);
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
{ };
}
# 65 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 1 3
# 63 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 3
# 63 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 89 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 3
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 { };
# 116 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 3
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;
};
# 162 "/usr/include/c++/4.6/bits/stl_iterator_base_types.h" 3
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(); }
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(); }
};
}
# 67 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 1 3
# 63 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 3
# 63 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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;
}
# 110 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 3
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;
}
# 168 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 3
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));
}
# 200 "/usr/include/c++/4.6/bits/stl_iterator_base_funcs.h" 3
}
# 68 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_iterator.h" 1 3
# 68 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 96 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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); }
};
# 283 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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(); }
# 395 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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) { }
# 422 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
back_insert_iterator&
operator=(typename _Container::const_reference __value)
{
container->push_back(__value);
return *this;
}
# 445 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
back_insert_iterator&
operator*()
{ return *this; }
back_insert_iterator&
operator++()
{ return *this; }
back_insert_iterator
operator++(int)
{ return *this; }
};
# 471 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
template<typename _Container>
inline back_insert_iterator<_Container>
back_inserter(_Container& __x)
{ return back_insert_iterator<_Container>(__x); }
# 486 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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) { }
# 512 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
front_insert_iterator&
operator=(typename _Container::const_reference __value)
{
container->push_front(__value);
return *this;
}
# 535 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
front_insert_iterator&
operator*()
{ return *this; }
front_insert_iterator&
operator++()
{ return *this; }
front_insert_iterator
operator++(int)
{ return *this; }
};
# 561 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
template<typename _Container>
inline front_insert_iterator<_Container>
front_inserter(_Container& __x)
{ return front_insert_iterator<_Container>(__x); }
# 580 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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) {}
# 623 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
insert_iterator&
operator=(typename _Container::const_reference __value)
{
iter = container->insert(iter, __value);
++iter;
return *this;
}
# 649 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
insert_iterator&
operator*()
{ return *this; }
insert_iterator&
operator++()
{ return *this; }
insert_iterator&
operator++(int)
{ return *this; }
};
# 675 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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 __attribute__ ((__visibility__ ("default")))
{
# 699 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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; }
};
# 797 "/usr/include/c++/4.6/bits/stl_iterator.h" 3
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); }
}
# 69 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
# 1 "/usr/include/c++/4.6/debug/debug.h" 1 3
# 47 "/usr/include/c++/4.6/debug/debug.h" 3
namespace std
{
namespace __debug { }
}
namespace __gnu_debug
{
using namespace std::__debug;
}
# 71 "/usr/include/c++/4.6/bits/stl_algobase.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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);
}
};
# 116 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
# 135 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
}
# 157 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
# 185 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
template<typename _Tp>
inline const _Tp&
min(const _Tp& __a, const _Tp& __b)
{
if (__b < __a)
return __b;
return __a;
}
# 208 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
template<typename _Tp>
inline const _Tp&
max(const _Tp& __a, const _Tp& __b)
{
if (__a < __b)
return __b;
return __a;
}
# 231 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
# 252 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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>
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;
}
};
# 319 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
};
# 357 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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_trivial(_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)));
}
# 442 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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));
}
# 494 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
};
# 522 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
};
# 552 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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_trivial(_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)));
}
# 611 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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));
}
# 669 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
}
# 713 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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 (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__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 (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__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;
}
# 773 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
}
# 934 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __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); }
# 1008 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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));
}
# 1040 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
# 1071 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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));
}
# 1105 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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;
}
# 1145 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
}
# 1182 "/usr/include/c++/4.6/bits/stl_algobase.h" 3
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);
}
}
# 62 "/usr/include/c++/4.6/algorithm" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_algo.h" 1 3
# 61 "/usr/include/c++/4.6/bits/stl_algo.h" 3
# 1 "/usr/include/c++/4.6/cstdlib" 1 3
# 41 "/usr/include/c++/4.6/cstdlib" 3
# 41 "/usr/include/c++/4.6/cstdlib" 3
# 97 "/usr/include/c++/4.6/cstdlib" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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); }
}
# 157 "/usr/include/c++/4.6/cstdlib" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
using ::lldiv_t;
using ::_Exit;
inline long long
abs(long long __x) { return __x >= 0 ? __x : -__x; }
using ::llabs;
inline lldiv_t
div(long long __n, long long __d)
{ lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
using ::lldiv;
# 192 "/usr/include/c++/4.6/cstdlib" 3
using ::atoll;
using ::strtoll;
using ::strtoull;
using ::strtof;
using ::strtold;
}
namespace std
{
using ::__gnu_cxx::lldiv_t;
using ::__gnu_cxx::_Exit;
using ::__gnu_cxx::abs;
using ::__gnu_cxx::llabs;
using ::__gnu_cxx::div;
using ::__gnu_cxx::lldiv;
using ::__gnu_cxx::atoll;
using ::__gnu_cxx::strtof;
using ::__gnu_cxx::strtoll;
using ::__gnu_cxx::strtoull;
using ::__gnu_cxx::strtold;
}
# 62 "/usr/include/c++/4.6/bits/stl_algo.h" 2 3
# 1 "/usr/include/c++/4.6/bits/algorithmfwd.h" 1 3
# 33 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
# 33 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
# 1 "/usr/include/c++/4.6/initializer_list" 1 3
# 33 "/usr/include/c++/4.6/initializer_list" 3
# 33 "/usr/include/c++/4.6/initializer_list" 3
# 38 "/usr/include/c++/4.6/bits/algorithmfwd.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 200 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 229 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 268 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 331 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 416 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
template<typename _BIter>
bool
next_permutation(_BIter, _BIter);
template<typename _BIter, typename _Compare>
bool
next_permutation(_BIter, _BIter, _Compare);
# 433 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 454 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
# 537 "/usr/include/c++/4.6/bits/algorithmfwd.h" 3
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);
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);
}
# 63 "/usr/include/c++/4.6/bits/stl_algo.h" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_heap.h" 1 3
# 62 "/usr/include/c++/4.6/bits/stl_heap.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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);
}
# 154 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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);
}
# 203 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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));
}
# 276 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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);
}
# 350 "/usr/include/c++/4.6/bits/stl_heap.h" 3
template<typename _RandomAccessIterator, typename _Compare>
inline void
pop_heap(_RandomAccessIterator __first,
_RandomAccessIterator __last, _Compare __comp)
{
;
;
--__last;
std::__pop_heap(__first, __last, __last, __comp);
}
# 373 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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--;
}
}
# 413 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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--;
}
}
# 452 "/usr/include/c++/4.6/bits/stl_heap.h" 3
template<typename _RandomAccessIterator>
void
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
;
;
while (__last - __first > 1)
{
--__last;
std::__pop_heap(__first, __last, __last);
}
}
# 481 "/usr/include/c++/4.6/bits/stl_heap.h" 3
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);
}
}
# 579 "/usr/include/c++/4.6/bits/stl_heap.h" 3
}
# 64 "/usr/include/c++/4.6/bits/stl_algo.h" 2 3
# 1 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 1 3
# 61 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 3
# 1 "/usr/include/c++/4.6/bits/stl_construct.h" 1 3
# 61 "/usr/include/c++/4.6/bits/stl_construct.h" 3
# 1 "/usr/include/c++/4.6/new" 1 3
# 39 "/usr/include/c++/4.6/new" 3
# 39 "/usr/include/c++/4.6/new" 3
# 1 "/usr/include/c++/4.6/exception" 1 3
# 35 "/usr/include/c++/4.6/exception" 3
# 35 "/usr/include/c++/4.6/exception" 3
#pragma GCC visibility push(default)
extern "C++" {
namespace std
{
# 60 "/usr/include/c++/4.6/exception" 3
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__));
# 117 "/usr/include/c++/4.6/exception" 3
bool uncaught_exception() throw() __attribute__ ((__pure__));
}
namespace __gnu_cxx
{
# 142 "/usr/include/c++/4.6/exception" 3
void __verbose_terminate_handler();
}
}
#pragma GCC visibility pop
# 42 "/usr/include/c++/4.6/new" 2 3
#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();
}
# 92 "/usr/include/c++/4.6/new" 3
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
# 62 "/usr/include/c++/4.6/bits/stl_construct.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 78 "/usr/include/c++/4.6/bits/stl_construct.h" 3
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(std::__addressof(*__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(std::__addressof(*__first));
}
template<typename _ForwardIterator, typename _Tp>
inline void
_Destroy(_ForwardIterator __first, _ForwardIterator __last,
allocator<_Tp>&)
{
_Destroy(__first, __last);
}
}
# 62 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 84 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 3
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);
}
# 111 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 3
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<bool>
struct __uninitialized_construct_buf_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(std::__addressof(*__first),
(__value));
_ForwardIterator __prev = __cur;
++__cur;
for(; __cur != __last; ++__cur, ++__prev)
std::_Construct(std::__addressof(*__cur),
(*__prev));
__value = (*__prev);
}
catch(...)
{
std::_Destroy(__first, __cur);
throw;
}
}
};
template<>
struct __uninitialized_construct_buf_dispatch<true>
{
template<typename _ForwardIterator, typename _Tp>
static void
__ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
};
# 230 "/usr/include/c++/4.6/bits/stl_tempbuf.h" 3
template<typename _ForwardIterator, typename _Tp>
inline void
__uninitialized_construct_buf(_ForwardIterator __first,
_ForwardIterator __last,
_Tp& __value)
{
typedef typename std::iterator_traits<_ForwardIterator>::value_type
_ValueType;
std::__uninitialized_construct_buf_dispatch<
__has_trivial_constructor(_ValueType)>::
__ucr(__first, __last, __value);
}
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_buf(_M_buffer, _M_buffer + _M_len,
*__first);
}
catch(...)
{
std::return_temporary_buffer(_M_buffer);
_M_buffer = 0;
_M_len = 0;
throw;
}
}
}
# 65 "/usr/include/c++/4.6/bits/stl_algo.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{
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;
}
}
# 326 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
# 411 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
# 649 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 695 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 874 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 911 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 1086 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 1129 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 1169 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 1209 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
# 1437 "/usr/include/c++/4.6/bits/stl_algo.h" 3
template<typename _BidirectionalIterator>
inline void
reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
{
;
std::__reverse(__first, __last, std::__iterator_category(__first));
}
# 1464 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
}
}
# 1668 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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());
}
# 1702 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
# 1860 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 1942 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 1962 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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;
}
# 2008 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 2032 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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);
}
# 2392 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__comp(*__middle, __val))
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else
__len = __half;
}
return __first;
}
# 2439 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__val < *__middle)
__len = __half;
else
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
}
return __first;
}
# 2488 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__comp(__val, *__middle))
__len = __half;
else
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
}
return __first;
}
# 2541 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (*__middle < __val)
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else if (__val < *__middle)
__len = __half;
else
{
_ForwardIterator __left = std::lower_bound(__first, __middle,
__val);
std::advance(__first, __len);
_ForwardIterator __right = std::upper_bound(++__middle, __first,
__val);
return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
}
}
return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
}
# 2603 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 2620 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
_DistanceType __len = std::distance(__first, __last);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __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
{
_ForwardIterator __left = std::lower_bound(__first, __middle,
__val, __comp);
std::advance(__first, __len);
_ForwardIterator __right = std::upper_bound(++__middle, __first,
__val, __comp);
return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
}
}
return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
}
# 2663 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 2696 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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 _InputIterator1, typename _InputIterator2,
typename _OutputIterator>
void
__move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result)
{
while (__first1 != __last1 && __first2 != __last2)
{
if (*__first2 < *__first1)
{
*__result = (*__first2);
++__first2;
}
else
{
*__result = (*__first1);
++__first1;
}
++__result;
}
if (__first1 != __last1)
std::copy(__first1, __last1, __result);
}
template<typename _InputIterator1, typename _InputIterator2,
typename _OutputIterator, typename _Compare>
void
__move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result, _Compare __comp)
{
while (__first1 != __last1 && __first2 != __last2)
{
if (__comp(*__first2, *__first1))
{
*__result = (*__first2);
++__first2;
}
else
{
*__result = (*__first1);
++__first1;
}
++__result;
}
if (__first1 != __last1)
std::copy(__first1, __last1, __result);
}
template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
typename _BidirectionalIterator3>
void
__move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
_BidirectionalIterator1 __last1,
_BidirectionalIterator2 __first2,
_BidirectionalIterator2 __last2,
_BidirectionalIterator3 __result)
{
if (__first1 == __last1)
{
std::copy_backward(__first2, __last2, __result);
return;
}
else if (__first2 == __last2)
return;
--__last1;
--__last2;
while (true)
{
if (*__last2 < *__last1)
{
*--__result = (*__last1);
if (__first1 == __last1)
{
std::copy_backward(__first2, ++__last2, __result);
return;
}
--__last1;
}
else
{
*--__result = (*__last2);
if (__first2 == __last2)
return;
--__last2;
}
}
}
template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
typename _BidirectionalIterator3, typename _Compare>
void
__move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
_BidirectionalIterator1 __last1,
_BidirectionalIterator2 __first2,
_BidirectionalIterator2 __last2,
_BidirectionalIterator3 __result,
_Compare __comp)
{
if (__first1 == __last1)
{
std::copy_backward(__first2, __last2, __result);
return;
}
else if (__first2 == __last2)
return;
--__last1;
--__last2;
while (true)
{
if (__comp(*__last2, *__last1))
{
*--__result = (*__last1);
if (__first1 == __last1)
{
std::copy_backward(__first2, ++__last2, __result);
return;
}
--__last1;
}
else
{
*--__result = (*__last2);
if (__first2 == __last2)
return;
--__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)
{
if (__len2)
{
__buffer_end = std::copy(__middle, __last, __buffer);
std::copy_backward(__first, __middle, __last);
return std::copy(__buffer, __buffer_end, __first);
}
else
return __first;
}
else if (__len1 <= __buffer_size)
{
if (__len1)
{
__buffer_end = std::copy(__first, __middle, __buffer);
std::copy(__middle, __last, __first);
return std::copy_backward(__buffer, __buffer_end, __last);
}
else
return __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::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
__first);
}
else if (__len2 <= __buffer_size)
{
_Pointer __buffer_end = std::copy(__middle, __last, __buffer);
std::__move_merge_adaptive_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::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
__first, __comp);
}
else if (__len2 <= __buffer_size)
{
_Pointer __buffer_end = std::copy(__middle, __last, __buffer);
std::__move_merge_adaptive_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);
}
# 3120 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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()));
}
# 3175 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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 _InputIterator1, typename _InputIterator2,
typename _OutputIterator>
_OutputIterator
__move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result)
{
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
__move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_OutputIterator __result, _Compare __comp)
{
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 _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::__move_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::__move_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::__move_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::__move_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);
}
# 3513 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 3562 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 3581 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first2, *__first1))
return false;
else if(__comp(*__first1, *__first2))
++__first1;
else
++__first1, ++__first2;
return __first2 == __last2;
}
# 3617 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
}
# 3674 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
}
# 3730 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
}
# 3787 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
}
# 3847 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 3884 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4371 "/usr/include/c++/4.6/bits/stl_algo.h" 3
template<typename _InputIterator, typename _Function>
_Function
for_each(_InputIterator __first, _InputIterator __last, _Function __f)
{
;
for (; __first != __last; ++__first)
__f(*__first);
return (__f);
}
# 4392 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 4416 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 4445 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4484 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4516 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4548 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4580 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4605 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4645 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4716 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4790 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 4826 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 4868 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4904 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4937 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 4969 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 5001 "/usr/include/c++/4.6/bits/stl_algo.h" 3
template<typename _ForwardIterator, typename _Generator>
void
generate(_ForwardIterator __first, _ForwardIterator __last,
_Generator __gen)
{
;
for (; __first != __last; ++__first)
*__first = __gen();
}
# 5032 "/usr/include/c++/4.6/bits/stl_algo.h" 3
template<typename _OutputIterator, typename _Size, typename _Generator>
_OutputIterator
generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
{
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, ++__first)
*__first = __gen();
return __first;
}
# 5069 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 5108 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 5140 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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)));
}
# 5168 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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));
}
# 5204 "/usr/include/c++/4.6/bits/stl_algo.h" 3
template<typename _ForwardIterator, typename _Predicate>
inline _ForwardIterator
partition(_ForwardIterator __first, _ForwardIterator __last,
_Predicate __pred)
{
;
return std::__partition(__first, __last, __pred,
std::__iterator_category(__first));
}
# 5238 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 5277 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 5315 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 5354 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 5392 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
}
# 5428 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
}
# 5469 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5489 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 5532 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5553 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 5592 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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()));
}
# 5634 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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);
}
# 5680 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5701 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 5747 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5770 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 5814 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5833 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2)
++__first1;
else if (*__first2 < *__first1)
++__first2;
else
{
*__result = *__first1;
++__first1;
++__first2;
++__result;
}
return __result;
}
# 5871 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5892 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first1, *__first2))
++__first1;
else if (__comp(*__first2, *__first1))
++__first2;
else
{
*__result = *__first1;
++__first1;
++__first2;
++__result;
}
return __result;
}
# 5929 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 5948 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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);
}
# 5990 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 6011 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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);
}
# 6048 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 6069 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 6114 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
# 6138 "/usr/include/c++/4.6/bits/stl_algo.h" 3
;
;
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));
}
# 6171 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 6199 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 6227 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
# 6255 "/usr/include/c++/4.6/bits/stl_algo.h" 3
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;
}
}
# 63 "/usr/include/c++/4.6/algorithm" 2 3
# 28 "impl/block/aes-native/aesni.cc" 2
# 1 "include/drew/block.h" 1
# 25 "include/drew/block.h"
# 1 "/usr/include/errno.h" 1 3 4
# 32 "/usr/include/errno.h" 3 4
extern "C" {
# 1 "/usr/include/x86_64-linux-gnu/bits/errno.h" 1 3 4
# 25 "/usr/include/x86_64-linux-gnu/bits/errno.h" 3 4
# 1 "/usr/include/linux/errno.h" 1 3 4
# 1 "/usr/include/x86_64-linux-gnu/asm/errno.h" 1 3 4
# 1 "/usr/include/asm-generic/errno.h" 1 3 4
# 1 "/usr/include/asm-generic/errno-base.h" 1 3 4
# 5 "/usr/include/asm-generic/errno.h" 2 3 4
# 2 "/usr/include/x86_64-linux-gnu/asm/errno.h" 2 3 4
# 5 "/usr/include/linux/errno.h" 2 3 4
# 26 "/usr/include/x86_64-linux-gnu/bits/errno.h" 2 3 4
# 47 "/usr/include/x86_64-linux-gnu/bits/errno.h" 3 4
extern int *__errno_location (void) throw () __attribute__ ((__const__));
# 37 "/usr/include/errno.h" 2 3 4
# 55 "/usr/include/errno.h" 3 4
extern char *program_invocation_name, *program_invocation_short_name;
}
# 69 "/usr/include/errno.h" 3 4
typedef int error_t;
# 26 "include/drew/block.h" 2
# 1 "/usr/include/stdint.h" 1 3 4
# 27 "/usr/include/stdint.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wchar.h" 1 3 4
# 28 "/usr/include/stdint.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 29 "/usr/include/stdint.h" 2 3 4
# 49 "/usr/include/stdint.h" 3 4
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;
# 66 "/usr/include/stdint.h" 3 4
typedef signed char int_least8_t;
typedef short int int_least16_t;
typedef int int_least32_t;
typedef long int int_least64_t;
typedef unsigned char uint_least8_t;
typedef unsigned short int uint_least16_t;
typedef unsigned int uint_least32_t;
typedef unsigned long int uint_least64_t;
# 91 "/usr/include/stdint.h" 3 4
typedef signed char int_fast8_t;
typedef long int int_fast16_t;
typedef long int int_fast32_t;
typedef long int int_fast64_t;
# 104 "/usr/include/stdint.h" 3 4
typedef unsigned char uint_fast8_t;
typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
# 120 "/usr/include/stdint.h" 3 4
typedef long int intptr_t;
typedef unsigned long int uintptr_t;
# 135 "/usr/include/stdint.h" 3 4
typedef long int intmax_t;
typedef unsigned long int uintmax_t;
# 27 "include/drew/block.h" 2
# 1 "include/drew/drew.h" 1
# 68 "include/drew/drew.h"
extern "C" __attribute__ ((visibility("default")))
int drew_get_version(int op, const char **sp, void *p);
# 1 "include/drew/plugin.h" 1
# 25 "include/drew/plugin.h"
# 1 "include/drew/drew.h" 1
# 26 "include/drew/plugin.h" 2
extern "C" {
# 39 "include/drew/plugin.h"
typedef struct {
int version;
const char *subject;
const char *predicate;
int type;
const char *object;
} drew_metadata_t;
struct drew_loader_s;
typedef struct drew_loader_s drew_loader_t;
# 102 "include/drew/plugin.h"
extern "C" __attribute__ ((visibility("default")))
int drew_loader_new(drew_loader_t **ldr);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_free(drew_loader_t **ldr);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_load_plugin(drew_loader_t *ldr, const char *plugin,
const char *path);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_nplugins(const drew_loader_t *ldr, int id);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_type(const drew_loader_t *ldr, int id);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_functbl(const drew_loader_t *ldr, int id, const void **tbl);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_algo_name(const drew_loader_t *ldr, int id,
const char **namep);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_lookup_by_name(const drew_loader_t *ldr, const char *name,
int start, int end);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_lookup_by_type(const drew_loader_t *ldr, int type, int start,
int end);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_metadata(const drew_loader_t *ldr, int id, int item,
drew_metadata_t *meta);
extern "C" __attribute__ ((visibility("default")))
int drew_loader_get_search_path(const drew_loader_t *ldr, int num,
const char **p);
}
# 72 "include/drew/drew.h" 2
# 29 "include/drew/block.h" 2
# 1 "include/drew/param.h" 1
# 25 "include/drew/param.h"
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3
# 26 "include/drew/param.h" 2
# 38 "include/drew/param.h"
typedef struct drew_param_t {
struct drew_param_t *next;
const char *name;
union {
const char *string;
size_t number;
void *value;
struct {
void *ptr;
size_t len;
} array;
} param;
} drew_param_t;
# 30 "include/drew/block.h" 2
# 72 "include/drew/block.h"
typedef struct {
int (*info)(int op, void *p);
void (*init)(void **, drew_loader_t *, const drew_param_t *);
int (*setkey)(void *, const uint8_t *, size_t);
void (*encrypt)(void *, uint8_t *, const uint8_t *);
void (*decrypt)(void *, uint8_t *, const uint8_t *);
int (*test)(void *);
void (*fini)(void **);
int (*clone)(void **, void *, int);
} drew_block_functbl0_t;
typedef struct {
int (*info)(int op, void *p);
int (*init)(void **, void *, int, drew_loader_t *, const drew_param_t *);
int (*clone)(void **, void *, int);
int (*fini)(void **, int);
int (*setkey)(void *, const uint8_t *, size_t, int);
int (*encrypt)(void *, uint8_t *, const uint8_t *);
int (*decrypt)(void *, uint8_t *, const uint8_t *);
int (*test)(void *, drew_loader_t *);
} drew_block_functbl1_t;
struct drew_block_s;
typedef struct drew_block_s drew_block_t;
typedef struct {
int (*info)(int op, void *p);
int (*init)(drew_block_t *, int,
const drew_loader_t *, const drew_param_t *);
int (*clone)(drew_block_t *, const drew_block_t *, int);
int (*reset)(drew_block_t *);
int (*fini)(drew_block_t *, int);
int (*setkey)(drew_block_t *, const uint8_t *, size_t, int);
int (*encrypt)(const drew_block_t *, uint8_t *, const uint8_t *);
int (*decrypt)(const drew_block_t *, uint8_t *, const uint8_t *);
int (*encryptfast)(const drew_block_t *, uint8_t *, const uint8_t *,
size_t);
int (*decryptfast)(const drew_block_t *, uint8_t *, const uint8_t *,
size_t);
int (*test)(void *, const drew_loader_t *);
} drew_block_functbl2_t;
typedef struct {
int (*info)(int op, void *p);
int (*info2)(const drew_block_t *, int op, drew_param_t *,
const drew_param_t *);
int (*init)(drew_block_t *, int,
const drew_loader_t *, const drew_param_t *);
int (*clone)(drew_block_t *, const drew_block_t *, int);
int (*reset)(drew_block_t *);
int (*fini)(drew_block_t *, int);
int (*setkey)(drew_block_t *, const uint8_t *, size_t, int);
int (*encrypt)(const drew_block_t *, uint8_t *, const uint8_t *);
int (*decrypt)(const drew_block_t *, uint8_t *, const uint8_t *);
int (*encryptfast)(const drew_block_t *, uint8_t *, const uint8_t *,
size_t);
int (*decryptfast)(const drew_block_t *, uint8_t *, const uint8_t *,
size_t);
int (*test)(void *, const drew_loader_t *);
} drew_block_functbl3_t;
typedef drew_block_functbl3_t drew_block_functbl_t;
struct drew_block_s {
void *ctx;
const drew_block_functbl_t *functbl;
void *priv;
};
# 30 "impl/block/aes-native/aesni.cc" 2
# 1 "impl/block/block-plugin.h" 1
# 27 "impl/block/block-plugin.h"
# 1 "/usr/include/errno.h" 1 3 4
# 28 "impl/block/block-plugin.h" 2
extern "C" {
# 1 "impl/block/aes-native/metadata.gen" 1
# 39 "impl/block/block-plugin.h" 2
# 48 "impl/block/block-plugin.h"
struct plugin {
const char *name;
const drew_block_functbl_t *functbl;
};
# 102 "impl/block/block-plugin.h"
}
# 31 "impl/block/aes-native/aesni.cc" 2
# 1 "impl/block/aes-native//aes.hh" 1
# 27 "impl/block/aes-native//aes.hh"
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3
# 28 "impl/block/aes-native//aes.hh" 2
# 1 "impl/block/block-plugin.hh" 1
# 33 "impl/block/block-plugin.hh"
# 1 "include/util.hh" 1
# 26 "include/util.hh"
# 1 "include/util.h" 1
# 25 "include/util.h"
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3
# 26 "include/util.h" 2
# 1 "/usr/include/arpa/inet.h" 1 3 4
# 23 "/usr/include/arpa/inet.h" 3 4
# 1 "/usr/include/netinet/in.h" 1 3 4
# 25 "/usr/include/netinet/in.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/socket.h" 1 3 4
# 26 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern "C" {
# 1 "/usr/include/x86_64-linux-gnu/sys/uio.h" 1 3 4
# 26 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern "C" {
# 1 "/usr/include/x86_64-linux-gnu/bits/uio.h" 1 3 4
# 44 "/usr/include/x86_64-linux-gnu/bits/uio.h" 3 4
struct iovec
{
void *iov_base;
size_t iov_len;
};
# 30 "/usr/include/x86_64-linux-gnu/sys/uio.h" 2 3 4
# 40 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t readv (int __fd, __const struct iovec *__iovec, int __count)
;
# 51 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t writev (int __fd, __const struct iovec *__iovec, int __count)
;
# 66 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t preadv (int __fd, __const struct iovec *__iovec, int __count,
__off_t __offset) ;
# 78 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t pwritev (int __fd, __const struct iovec *__iovec, int __count,
__off_t __offset) ;
# 104 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t preadv64 (int __fd, __const struct iovec *__iovec, int __count,
__off64_t __offset) ;
# 116 "/usr/include/x86_64-linux-gnu/sys/uio.h" 3 4
extern ssize_t pwritev64 (int __fd, __const struct iovec *__iovec, int __count,
__off64_t __offset) ;
}
# 29 "/usr/include/x86_64-linux-gnu/sys/socket.h" 2 3 4
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 31 "/usr/include/x86_64-linux-gnu/sys/socket.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 1 3 4
# 34 "/usr/include/x86_64-linux-gnu/sys/socket.h" 2 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/socket.h" 1 3 4
# 29 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
# 1 "/usr/include/clang/3.0/include/stddef.h" 1 3 4
# 30 "/usr/include/x86_64-linux-gnu/bits/socket.h" 2 3 4
typedef __socklen_t socklen_t;
enum __socket_type
{
SOCK_STREAM = 1,
SOCK_DGRAM = 2,
SOCK_RAW = 3,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_DCCP = 6,
SOCK_PACKET = 10,
SOCK_CLOEXEC = 02000000,
SOCK_NONBLOCK = 04000
};
# 175 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/sockaddr.h" 1 3 4
# 29 "/usr/include/x86_64-linux-gnu/bits/sockaddr.h" 3 4
typedef unsigned short int sa_family_t;
# 176 "/usr/include/x86_64-linux-gnu/bits/socket.h" 2 3 4
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
# 191 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
struct sockaddr_storage
{
sa_family_t ss_family;
unsigned long int __ss_align;
char __ss_padding[(128 - (2 * sizeof (unsigned long int)))];
};
enum
{
MSG_OOB = 0x01,
MSG_PEEK = 0x02,
MSG_DONTROUTE = 0x04,
MSG_TRYHARD = MSG_DONTROUTE,
MSG_CTRUNC = 0x08,
MSG_PROXY = 0x10,
MSG_TRUNC = 0x20,
MSG_DONTWAIT = 0x40,
MSG_EOR = 0x80,
MSG_WAITALL = 0x100,
MSG_FIN = 0x200,
MSG_SYN = 0x400,
MSG_CONFIRM = 0x800,
MSG_RST = 0x1000,
MSG_ERRQUEUE = 0x2000,
MSG_NOSIGNAL = 0x4000,
MSG_MORE = 0x8000,
MSG_WAITFORONE = 0x10000,
MSG_CMSG_CLOEXEC = 0x40000000
};
struct msghdr
{
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
size_t msg_iovlen;
void *msg_control;
size_t msg_controllen;
int msg_flags;
};
struct mmsghdr
{
struct msghdr msg_hdr;
unsigned int msg_len;
};
struct cmsghdr
{
size_t cmsg_len;
int cmsg_level;
int cmsg_type;
__extension__ unsigned char __cmsg_data [];
};
# 308 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
struct cmsghdr *__cmsg) throw ();
# 335 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
enum
{
SCM_RIGHTS = 0x01
, SCM_CREDENTIALS = 0x02
};
struct ucred
{
pid_t pid;
uid_t uid;
gid_t gid;
};
# 381 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/asm/socket.h" 1 3 4
# 1 "/usr/include/asm-generic/socket.h" 1 3 4
# 1 "/usr/include/x86_64-linux-gnu/asm/sockios.h" 1 3 4
# 1 "/usr/include/asm-generic/sockios.h" 1 3 4
# 2 "/usr/include/x86_64-linux-gnu/asm/sockios.h" 2 3 4
# 5 "/usr/include/asm-generic/socket.h" 2 3 4
# 2 "/usr/include/x86_64-linux-gnu/asm/socket.h" 2 3 4
# 382 "/usr/include/x86_64-linux-gnu/bits/socket.h" 2 3 4
# 415 "/usr/include/x86_64-linux-gnu/bits/socket.h" 3 4
struct linger
{
int l_onoff;
int l_linger;
};
extern "C" {
extern int recvmmsg (int __fd, struct mmsghdr *__vmessages,
unsigned int __vlen, int __flags,
__const struct timespec *__tmo);
}
# 41 "/usr/include/x86_64-linux-gnu/sys/socket.h" 2 3 4
struct osockaddr
{
unsigned short int sa_family;
unsigned char sa_data[14];
};
enum
{
SHUT_RD = 0,
SHUT_WR,
SHUT_RDWR
};
# 105 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern int socket (int __domain, int __type, int __protocol) throw ();
extern int socketpair (int __domain, int __type, int __protocol,
int __fds[2]) throw ();
extern int bind (int __fd, __const struct sockaddr * __addr, socklen_t __len)
throw ();
extern int getsockname (int __fd, struct sockaddr *__restrict __addr,
socklen_t *__restrict __len) throw ();
# 129 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern int connect (int __fd, __const struct sockaddr * __addr, socklen_t __len);
extern int getpeername (int __fd, struct sockaddr *__restrict __addr,
socklen_t *__restrict __len) throw ();
extern ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags);
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
extern ssize_t sendto (int __fd, __const void *__buf, size_t __n,
int __flags, __const struct sockaddr * __addr,
socklen_t __addr_len);
# 166 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n,
int __flags, struct sockaddr *__restrict __addr,
socklen_t *__restrict __addr_len);
extern ssize_t sendmsg (int __fd, __const struct msghdr *__message,
int __flags);
extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
extern int getsockopt (int __fd, int __level, int __optname,
void *__restrict __optval,
socklen_t *__restrict __optlen) throw ();
extern int setsockopt (int __fd, int __level, int __optname,
__const void *__optval, socklen_t __optlen) throw ();
extern int listen (int __fd, int __n) throw ();
# 214 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern int accept (int __fd, struct sockaddr *__restrict __addr,
socklen_t *__restrict __addr_len);
extern int accept4 (int __fd, struct sockaddr *__restrict __addr,
socklen_t *__restrict __addr_len, int __flags);
# 232 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
extern int shutdown (int __fd, int __how) throw ();
extern int sockatmark (int __fd) throw ();
extern int isfdtype (int __fd, int __fdtype) throw ();
# 254 "/usr/include/x86_64-linux-gnu/sys/socket.h" 3 4
}
# 26 "/usr/include/netinet/in.h" 2 3 4
extern "C" {
enum
{
IPPROTO_IP = 0,
IPPROTO_HOPOPTS = 0,
IPPROTO_ICMP = 1,
IPPROTO_IGMP = 2,
IPPROTO_IPIP = 4,
IPPROTO_TCP = 6,
IPPROTO_EGP = 8,
IPPROTO_PUP = 12,
IPPROTO_UDP = 17,
IPPROTO_IDP = 22,
IPPROTO_TP = 29,
IPPROTO_DCCP = 33,
IPPROTO_IPV6 = 41,
IPPROTO_ROUTING = 43,
IPPROTO_FRAGMENT = 44,
IPPROTO_RSVP = 46,
IPPROTO_GRE = 47,
IPPROTO_ESP = 50,
IPPROTO_AH = 51,
IPPROTO_ICMPV6 = 58,
IPPROTO_NONE = 59,
IPPROTO_DSTOPTS = 60,
IPPROTO_MTP = 92,
IPPROTO_ENCAP = 98,
IPPROTO_PIM = 103,
IPPROTO_COMP = 108,
IPPROTO_SCTP = 132,
IPPROTO_UDPLITE = 136,
IPPROTO_RAW = 255,
IPPROTO_MAX
};
typedef uint16_t in_port_t;
enum
{
IPPORT_ECHO = 7,
IPPORT_DISCARD = 9,
IPPORT_SYSTAT = 11,
IPPORT_DAYTIME = 13,
IPPORT_NETSTAT = 15,
IPPORT_FTP = 21,
IPPORT_TELNET = 23,
IPPORT_SMTP = 25,
IPPORT_TIMESERVER = 37,
IPPORT_NAMESERVER = 42,
IPPORT_WHOIS = 43,
IPPORT_MTP = 57,
IPPORT_TFTP = 69,
IPPORT_RJE = 77,
IPPORT_FINGER = 79,
IPPORT_TTYLINK = 87,
IPPORT_SUPDUP = 95,
IPPORT_EXECSERVER = 512,
IPPORT_LOGINSERVER = 513,
IPPORT_CMDSERVER = 514,
IPPORT_EFSSERVER = 520,
IPPORT_BIFFUDP = 512,
IPPORT_WHOSERVER = 513,
IPPORT_ROUTESERVER = 520,
IPPORT_RESERVED = 1024,
IPPORT_USERRESERVED = 5000
};
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
# 198 "/usr/include/netinet/in.h" 3 4
struct in6_addr
{
union
{
uint8_t __u6_addr8[16];
uint16_t __u6_addr16[8];
uint32_t __u6_addr32[4];
} __in6_u;
};
extern const struct in6_addr in6addr_any;
extern const struct in6_addr in6addr_loopback;
# 225 "/usr/include/netinet/in.h" 3 4
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[sizeof (struct sockaddr) -
(sizeof (unsigned short int)) -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
struct sockaddr_in6
{
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
struct ip_mreq_source
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
struct in_addr imr_sourceaddr;
};
struct ipv6_mreq
{
struct in6_addr ipv6mr_multiaddr;
unsigned int ipv6mr_interface;
};
struct group_req
{
uint32_t gr_interface;
struct sockaddr_storage gr_group;
};
struct group_source_req
{
uint32_t gsr_interface;
struct sockaddr_storage gsr_group;
struct sockaddr_storage gsr_source;
};
struct ip_msfilter
{
struct in_addr imsf_multiaddr;
struct in_addr imsf_interface;
uint32_t imsf_fmode;
uint32_t imsf_numsrc;
struct in_addr imsf_slist[1];
};
struct group_filter
{
uint32_t gf_interface;
struct sockaddr_storage gf_group;
uint32_t gf_fmode;
uint32_t gf_numsrc;
struct sockaddr_storage gf_slist[1];
};
# 356 "/usr/include/netinet/in.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/in.h" 1 3 4
# 98 "/usr/include/x86_64-linux-gnu/bits/in.h" 3 4
struct ip_opts
{
struct in_addr ip_dst;
char ip_opts[40];
};
struct ip_mreqn
{
struct in_addr imr_multiaddr;
struct in_addr imr_address;
int imr_ifindex;
};
struct in_pktinfo
{
int ipi_ifindex;
struct in_addr ipi_spec_dst;
struct in_addr ipi_addr;
};
# 357 "/usr/include/netinet/in.h" 2 3 4
extern uint32_t ntohl (uint32_t __netlong) throw () __attribute__ ((__const__));
extern uint16_t ntohs (uint16_t __netshort)
throw () __attribute__ ((__const__));
extern uint32_t htonl (uint32_t __hostlong)
throw () __attribute__ ((__const__));
extern uint16_t htons (uint16_t __hostshort)
throw () __attribute__ ((__const__));
# 1 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 1 3 4
# 377 "/usr/include/netinet/in.h" 2 3 4
# 440 "/usr/include/netinet/in.h" 3 4
extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) throw ();
extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
throw ();
# 471 "/usr/include/netinet/in.h" 3 4
struct in6_pktinfo
{
struct in6_addr ipi6_addr;
unsigned int ipi6_ifindex;
};
struct ip6_mtuinfo
{
struct sockaddr_in6 ip6m_addr;
uint32_t ip6m_mtu;
};
extern int inet6_option_space (int __nbytes)
throw () __attribute__ ((__deprecated__));
extern int inet6_option_init (void *__bp, struct cmsghdr **__cmsgp,
int __type) throw () __attribute__ ((__deprecated__));
extern int inet6_option_append (struct cmsghdr *__cmsg,
__const uint8_t *__typep, int __multx,
int __plusy) throw () __attribute__ ((__deprecated__));
extern uint8_t *inet6_option_alloc (struct cmsghdr *__cmsg, int __datalen,
int __multx, int __plusy)
throw () __attribute__ ((__deprecated__));
extern int inet6_option_next (__const struct cmsghdr *__cmsg,
uint8_t **__tptrp)
throw () __attribute__ ((__deprecated__));
extern int inet6_option_find (__const struct cmsghdr *__cmsg,
uint8_t **__tptrp, int __type)
throw () __attribute__ ((__deprecated__));
extern int inet6_opt_init (void *__extbuf, socklen_t __extlen) throw ();
extern int inet6_opt_append (void *__extbuf, socklen_t __extlen, int __offset,
uint8_t __type, socklen_t __len, uint8_t __align,
void **__databufp) throw ();
extern int inet6_opt_finish (void *__extbuf, socklen_t __extlen, int __offset)
throw ();
extern int inet6_opt_set_val (void *__databuf, int __offset, void *__val,
socklen_t __vallen) throw ();
extern int inet6_opt_next (void *__extbuf, socklen_t __extlen, int __offset,
uint8_t *__typep, socklen_t *__lenp,
void **__databufp) throw ();
extern int inet6_opt_find (void *__extbuf, socklen_t __extlen, int __offset,
uint8_t __type, socklen_t *__lenp,
void **__databufp) throw ();
extern int inet6_opt_get_val (void *__databuf, int __offset, void *__val,
socklen_t __vallen) throw ();
extern socklen_t inet6_rth_space (int __type, int __segments) throw ();
extern void *inet6_rth_init (void *__bp, socklen_t __bp_len, int __type,
int __segments) throw ();
extern int inet6_rth_add (void *__bp, __const struct in6_addr *__addr) throw ();
extern int inet6_rth_reverse (__const void *__in, void *__out) throw ();
extern int inet6_rth_segments (__const void *__bp) throw ();
extern struct in6_addr *inet6_rth_getaddr (__const void *__bp, int __index)
throw ();
extern int getipv4sourcefilter (int __s, struct in_addr __interface_addr,
struct in_addr __group, uint32_t *__fmode,
uint32_t *__numsrc, struct in_addr *__slist)
throw ();
extern int setipv4sourcefilter (int __s, struct in_addr __interface_addr,
struct in_addr __group, uint32_t __fmode,
uint32_t __numsrc,
__const struct in_addr *__slist)
throw ();
extern int getsourcefilter (int __s, uint32_t __interface_addr,
__const struct sockaddr *__group,
socklen_t __grouplen, uint32_t *__fmode,
uint32_t *__numsrc,
struct sockaddr_storage *__slist) throw ();
extern int setsourcefilter (int __s, uint32_t __interface_addr,
__const struct sockaddr *__group,
socklen_t __grouplen, uint32_t __fmode,
uint32_t __numsrc,
__const struct sockaddr_storage *__slist) throw ();
}
# 24 "/usr/include/arpa/inet.h" 2 3 4
extern "C" {
extern in_addr_t inet_addr (__const char *__cp) throw ();
extern in_addr_t inet_lnaof (struct in_addr __in) throw ();
extern struct in_addr inet_makeaddr (in_addr_t __net, in_addr_t __host)
throw ();
extern in_addr_t inet_netof (struct in_addr __in) throw ();
extern in_addr_t inet_network (__const char *__cp) throw ();
extern char *inet_ntoa (struct in_addr __in) throw ();
extern int inet_pton (int __af, __const char *__restrict __cp,
void *__restrict __buf) throw ();
extern __const char *inet_ntop (int __af, __const void *__restrict __cp,
char *__restrict __buf, socklen_t __len)
throw ();
extern int inet_aton (__const char *__cp, struct in_addr *__inp) throw ();
extern char *inet_neta (in_addr_t __net, char *__buf, size_t __len) throw ();
extern char *inet_net_ntop (int __af, __const void *__cp, int __bits,
char *__buf, size_t __len) throw ();
extern int inet_net_pton (int __af, __const char *__cp,
void *__buf, size_t __len) throw ();
extern unsigned int inet_nsap_addr (__const char *__cp,
unsigned char *__buf, int __len) throw ();
extern char *inet_nsap_ntoa (int __len, __const unsigned char *__cp,
char *__buf) throw ();
}
# 30 "include/util.h" 2
# 58 "include/util.h"
# 1 "/usr/include/byteswap.h" 1 3 4
# 23 "/usr/include/byteswap.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 1 3 4
# 24 "/usr/include/byteswap.h" 2 3 4
# 59 "include/util.h" 2
# 144 "include/util.h"
#pragma GCC visibility push(hidden)
inline void xor_aligned(uint8_t *outp, const uint8_t *inp, const uint8_t *xorp, size_t len)
{
struct aligned_data {
uint8_t data[16] __attribute__((aligned(16)));
};
len /= 16;
struct aligned_data *out = (struct aligned_data *)outp;
const struct aligned_data *in = (struct aligned_data *)inp;
const struct aligned_data *x = (struct aligned_data *)xorp;
for (size_t i = 0; i < len; i++, out++, in++, x++) {
typedef int vector_t __attribute__ ((vector_size (16)));
vector_t buf, xbuf;
memcpy(&buf, in->data, 16);
memcpy(&xbuf, x->data, 16);
buf ^= xbuf;
memcpy(out->data, &buf, 16);
}
}
inline void xor_aligned2(uint8_t *outp, const uint8_t *xorp, size_t len)
{
struct aligned_data {
uint8_t data[16] __attribute__((aligned(16)));
};
len /= 16;
struct aligned_data *out = (struct aligned_data *)outp;
const struct aligned_data *x = (struct aligned_data *)xorp;
for (size_t i = 0; i < len; i++, out++, x++) {
typedef int vector_t __attribute__ ((vector_size (16)));
vector_t buf, xbuf;
memcpy(&buf, out->data, 16);
memcpy(&xbuf, x->data, 16);
buf ^= xbuf;
memcpy(out->data, &buf, 16);
}
}
inline void xor_buffers(uint8_t *outp, const uint8_t *inp, const uint8_t *xorp,
size_t len)
{
for (size_t i = 0; i < len; i++)
*outp++ = *inp++ ^ *xorp++;
}
inline void xor_buffers2(uint8_t *outp, const uint8_t *xorp, size_t len)
{
for (size_t i = 0; i < len; i++)
*outp++ ^= *xorp++;
}
#pragma GCC visibility pop
# 27 "include/util.hh" 2
# 42 "include/util.hh"
#pragma GCC visibility push(hidden)
template<class T, size_t N>
struct AlignedBlock
{
T data[N] __attribute__((aligned(16)));
};
inline bool IsAligned(const void *p, size_t mul)
{
uintptr_t q = reinterpret_cast<uintptr_t>(p);
return !(q & (mul - 1));
}
template<class T>
inline bool IsAligned(const void *p)
{
return IsAligned(p, __alignof__(T));
}
template<class T>
inline size_t GetNeededAlignment()
{
return 1;
}
template<class T>
inline bool IsSufficientlyAligned(const void *p)
{
return IsAligned(p, GetNeededAlignment<T>());
}
inline int GetSystemEndianness()
{
return 1234U;
}
template<class T>
inline bool IsPowerOf2(T x)
{
return !(x & (x-1));
}
template<class T, class U>
inline T RoundUpToPowerOf2(T x, U pow2)
{
T m1 = pow2 - 1;
return (x + m1) & ~m1;
}
template<class T, class U>
inline T RoundUpToMultiple(T x, U multiple)
{
T t = x + (multiple - 1);
return t - (t % multiple);
}
template<class T, class U>
inline T DivideAndRoundUp(T x, U div)
{
T t = x + (div - 1);
return t / div;
}
template<class T>
inline T TernarySelection(T x, T y, T z)
{
return z ^ (x & (y ^ z));
}
template<class T>
inline T TernaryMajority(T x, T y, T z)
{
return (x & y) | (z & (x ^ y));
}
template<class T>
inline T TernaryParity(T x, T y, T z)
{
return x ^ y ^ z;
}
template<class T>
inline T RotateLeft(T x, size_t n)
{
return (x << n) | (x >> ((sizeof(T)*8) - n));
}
template<class T>
inline T RotateRight(T x, size_t n)
{
return (x >> n) | (x << ((sizeof(T)*8) - n));
}
template<class T>
inline void CopyAndXor(uint8_t *out, const uint8_t *in, size_t len,
uint8_t *mbuf, const size_t bufsz, size_t &bufrem, T &obj)
{
size_t boff = (bufsz - bufrem) % bufsz;
if (bufrem) {
const size_t b = std::min(bufrem, len);
for (size_t i = 0; i < b; i++)
out[i] = mbuf[boff + i] ^ in[i];
if ((boff += b) == bufsz)
boff = 0;
len -= b;
out += b;
in += b;
}
while (len >= bufsz) {
obj.FillBuffer(mbuf);
for (size_t i = 0; i < bufsz; i++)
out[i] = mbuf[i] ^ in[i];
len -= bufsz;
out += bufsz;
in += bufsz;
}
if (len) {
obj.FillBuffer(mbuf);
for (size_t i = 0; i < len; i++)
out[i] = mbuf[i] ^ in[i];
boff = len;
}
bufrem = (bufsz - boff) % bufsz;
}
template<class T>
inline void XorAligned(T *outp, const T *inp, const T *xorp, size_t len)
{
return xor_aligned(reinterpret_cast<uint8_t *>(outp),
reinterpret_cast<const uint8_t *>(inp),
reinterpret_cast<const uint8_t *>(xorp), len);
}
template<class T>
inline void XorAligned(T *outp, const T *xorp, size_t len)
{
return xor_aligned2(reinterpret_cast<uint8_t *>(outp),
reinterpret_cast<const uint8_t *>(xorp), len);
}
template<class T>
inline void XorBuffers(T *outp, const T *inp, const T *xorp, size_t len)
{
for (size_t i = 0; i < len / sizeof(T); i++)
outp[i] = inp[i] ^ xorp[i];
}
template<class T>
inline void XorBuffers(T *outp, const T *xorp, size_t len)
{
for (size_t i = 0; i < len / sizeof(T); i++)
outp[i] ^= xorp[i];
}
template<class T>
inline void CopyAndXorAligned(uint8_t *outp, const uint8_t *inp, size_t len,
uint8_t *mbufp, const size_t bufsz, T &obj)
{
typedef AlignedBlock<uint8_t, 16> AlignedData;
AlignedData *mbuf = reinterpret_cast<AlignedData *>(mbufp);
for (size_t i = 0; i < len; i += bufsz) {
AlignedData *out = reinterpret_cast<AlignedData *>(outp+i);
const AlignedData *in = reinterpret_cast<const AlignedData *>(inp+i);
obj.FillBufferAligned(mbuf->data);
XorAligned(out->data, in->data, mbuf->data, bufsz);
}
}
class EndianBase
{
public:
template<class T>
inline static uint8_t GetByte(T x, size_t n)
{
return x >> (n * 8);
}
template<class T>
inline static uint8_t GetByte(const T *p, size_t n)
{
return GetByte(*p, n);
}
template<class T>
inline static uint8_t GetArrayByte(const T *p, size_t n)
{
return GetByte(p[n/sizeof(T)], (n & (sizeof(T)-1)));
}
protected:
inline static void CopyBackwards(uint8_t *dest, const uint8_t *src,
size_t len, const size_t sz)
{
for (size_t i = 0; i < len; ) {
const size_t blk = i;
for (size_t j = 0; i < len && j < sz; j++, i++)
dest[blk+j] = src[blk+(sz-j-1)];
}
}
template<class T>
inline static void ByteSwap(T &x)
{
T p = 0;
for (size_t i = 0; i < sizeof(T); i++)
p |= ((x >> (i * 8)) & 0xff) << ((sizeof(T)-i-1) * 8);
x = p;
}
};
template<unsigned Endianness>
class Endian : public EndianBase
{
public:
template<class T>
inline static uint8_t *Copy(uint8_t *dest, const T *src, size_t len)
{
if (1234U == Endianness) {
memcpy(dest, src, len);
return dest;
}
else
return CopyByConvert(dest, src, len);
}
template<class T>
inline static T *Copy(T *dest, const uint8_t *src, size_t len)
{
if (1234U == Endianness) {
memcpy(dest, src, len);
return dest;
}
else
return CopyByConvert(dest, src, len);
}
template<class T>
inline static uint8_t *Copy(uint8_t *dest, const T *src, size_t len,
const size_t sz)
{
if (1234U == Endianness)
memcpy(dest, src, len);
else
CopyBackwards(dest, reinterpret_cast<const uint8_t *>(src), len,
sz);
return dest;
}
template<class T>
inline static T *Copy(T *dest, const uint8_t *src, size_t len,
const size_t sz)
{
if (1234U == Endianness)
memcpy(dest, src, len);
else
CopyBackwards(reinterpret_cast<uint8_t *>(dest), src, len, sz);
return dest;
}
template<class T>
inline static uint8_t *CopyCarefully(uint8_t *dest, const T *src, size_t len,
const size_t sz = sizeof(T))
{
if (1234U == Endianness)
memcpy(dest, src, len);
else
CopyBackwards(dest, reinterpret_cast<const uint8_t *>(src), len,
sz);
return dest;
}
template<class T>
inline static T *CopyCarefully(T *dest, const uint8_t *src, size_t len,
const size_t sz = sizeof(T))
{
if (1234U == Endianness)
memcpy(dest, src, len);
else
CopyBackwards(reinterpret_cast<uint8_t *>(dest), src, len, sz);
return dest;
}
template<class T>
inline static const T *CopyIfNeeded(T *buf, const uint8_t *p,
size_t len)
{
if (GetEndianness() == GetSystemEndianness() &&
IsSufficientlyAligned<T>(p))
return reinterpret_cast<const T *>(p);
else
return Copy(buf, p, len);
}
template<class T>
inline static T Convert(const uint8_t *p)
{
T x;
if (1234U == Endianness)
memcpy(&x, p, sizeof(x));
else {
memcpy(&x, p, sizeof(x));
ByteSwap(x);
}
return x;
}
template<class T>
inline static void Convert(uint8_t *buf, T p)
{
if (1234U == Endianness)
memcpy(buf, &p, sizeof(p));
else {
ByteSwap(p);
memcpy(buf, &p, sizeof(p));
}
}
inline static int GetEndianness()
{
return Endianness;
}
protected:
template<class T>
inline static uint8_t *CopyByConvert(uint8_t *dest, const T *src, size_t len)
{
for (size_t i = 0, j = 0; j < len; i++, j += sizeof(T))
Convert(dest+j, src[i]);
return dest;
}
template<class T>
inline static T *CopyByConvert(T *dest, const uint8_t *src, size_t len)
{
for (size_t i = 0, j = 0; j < len; i++, j += sizeof(T))
dest[i] = Convert<T>(src+j);
return dest;
}
};
template<>
inline void EndianBase::ByteSwap(uint16_t &x)
{
x =
(__extension__ ({ register unsigned short int __v, __x = (unsigned short int) (x); if (__builtin_constant_p (__x)) __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8))); else __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc"); __v; }));
}
template<>
inline void EndianBase::ByteSwap(uint32_t &x)
{
x =
(__extension__ ({ register unsigned int __v, __x = (x); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff000000) >> 24) | (((__x) & 0x00ff0000) >> 8) | (((__x) & 0x0000ff00) << 8) | (((__x) & 0x000000ff) << 24)); else __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); __v; }));
}
template<>
inline void EndianBase::ByteSwap(uint64_t &x)
{
x =
(__extension__ ({ register unsigned long __v, __x = (x); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff00000000000000ull) >> 56) | (((__x) & 0x00ff000000000000ull) >> 40) | (((__x) & 0x0000ff0000000000ull) >> 24) | (((__x) & 0x000000ff00000000ull) >> 8) | (((__x) & 0x00000000ff000000ull) << 8) | (((__x) & 0x0000000000ff0000ull) << 24) | (((__x) & 0x000000000000ff00ull) << 40) | (((__x) & 0x00000000000000ffull) << 56)); else __asm__ ("bswap %q0" : "=r" (__v) : "0" (__x)); __v; }));
}
class LittleEndian : public Endian<1234U>
{
};
class BigEndian : public Endian<4321U>
{
public:
template<class T>
inline static T Convert(const uint8_t *p)
{
return Endian<4321U>::Convert<T>(p);
}
template<class T>
inline static void Convert(uint8_t *buf, T p)
{
return Endian<4321U>::Convert<T>(buf, p);
}
};
class NonEndian : public EndianBase
{
public:
inline static uint8_t *CopyCarefully(uint8_t *dest, const uint8_t *src,
size_t len, const size_t sz = 1)
{
memcpy(dest, src, len);
return dest;
}
inline static uint8_t *Copy(uint8_t *dest, const uint8_t *src,
size_t len, const size_t sz)
{
memcpy(dest, src, len);
return dest;
}
inline static uint8_t *Copy(uint8_t *dest, const uint8_t *src,
size_t len)
{
memcpy(dest, src, len);
return dest;
}
inline static int GetEndianness()
{
return 0;
}
};
template<>
inline uint32_t BigEndian::Convert(const uint8_t *p)
{
uint32_t x;
memcpy(&x, p, sizeof(x));
return (__extension__ ({ register unsigned int __v, __x = (x); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff000000) >> 24) | (((__x) & 0x00ff0000) >> 8) | (((__x) & 0x0000ff00) << 8) | (((__x) & 0x000000ff) << 24)); else __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); __v; }));
}
template<>
inline uint16_t BigEndian::Convert(const uint8_t *p)
{
uint16_t x;
memcpy(&x, p, sizeof(x));
return (__extension__ ({ register unsigned short int __v, __x = (unsigned short int) (x); if (__builtin_constant_p (__x)) __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8))); else __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc"); __v; }));
}
template<>
inline void BigEndian::Convert(uint8_t *buf, uint32_t p)
{
uint32_t x = (__extension__ ({ register unsigned int __v, __x = (p); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff000000) >> 24) | (((__x) & 0x00ff0000) >> 8) | (((__x) & 0x0000ff00) << 8) | (((__x) & 0x000000ff) << 24)); else __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); __v; }));
memcpy(buf, &x, sizeof(x));
}
template<>
inline void BigEndian::Convert(uint8_t *buf, uint16_t p)
{
uint16_t x = (__extension__ ({ register unsigned short int __v, __x = (unsigned short int) (p); if (__builtin_constant_p (__x)) __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8))); else __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc"); __v; }));
memcpy(buf, &x, sizeof(x));
}
#pragma GCC visibility pop
typedef LittleEndian NativeEndian;
# 1 "include/util-i386.hh" 1
# 35 "include/util-i386.hh"
#pragma GCC visibility push(hidden)
# 54 "include/util-i386.hh"
template<> inline uint16_t RotateLeft(uint16_t x, size_t n) { if (__builtin_constant_p(n)) return (x << n) | (x >> (16 - n)); __asm__("ro" "l" "w" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
template<> inline uint32_t RotateLeft(uint32_t x, size_t n) { if (__builtin_constant_p(n)) return (x << n) | (x >> (32 - n)); __asm__("ro" "l" "l" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
template<> inline uint16_t RotateRight(uint16_t x, size_t n) { if (__builtin_constant_p(n)) return (x >> n) | (x << (16 - n)); __asm__("ro" "r" "w" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
template<> inline uint32_t RotateRight(uint32_t x, size_t n) { if (__builtin_constant_p(n)) return (x >> n) | (x << (32 - n)); __asm__("ro" "r" "l" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
template<> inline uint64_t RotateLeft(uint64_t x, size_t n) { if (__builtin_constant_p(n)) return (x << n) | (x >> (64 - n)); __asm__("ro" "l" "q" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
template<> inline uint64_t RotateRight(uint64_t x, size_t n) { if (__builtin_constant_p(n)) return (x >> n) | (x << (64 - n)); __asm__("ro" "r" "q" " %%cl, %0" : "=r"(x) : "0"(x), "c"(n)); return x; }
inline int GetCpuid(uint32_t func, uint32_t &a, uint32_t &b, uint32_t &c,
uint32_t &d)
{
__asm__ __volatile__("cpuid"
: "=a"(a), "=b"(b), "=c"(c), "=d"(d)
: "a"(func));
# 83 "include/util-i386.hh"
return 0;
}
template<>
inline uint8_t EndianBase::GetArrayByte(const uint64_t *arr, size_t n)
{
const uint8_t *p = reinterpret_cast<const uint8_t *>(arr);
return p[n];
}
template<>
template<>
inline uint8_t *Endian<4321U>::Copy<uint32_t>(uint8_t *dest, const uint32_t *src, size_t len)
{
typedef char vector_t __attribute__ ((vector_size (16)));
const vector_t perm = {0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c};
if (!(len % 16)) {
for (size_t i = 0; i < len; i += 16) {
vector_t buf;
memcpy(&buf, src+(i/4), 16);
buf = __builtin_ia32_pshufb128(buf, perm);
memcpy(dest+i, &buf, 16);
}
return dest;
}
else
return CopyByConvert(dest, src, len);
}
template<>
template<>
inline uint32_t *Endian<4321U>::Copy<uint32_t>(uint32_t *dest, const uint8_t *src, size_t len)
{
typedef char vector_t __attribute__ ((vector_size (16)));
const vector_t perm = {0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c};
if (!(len % 16)) {
for (size_t i = 0; i < len; i += 16) {
vector_t buf;
memcpy(&buf, src+i, 16);
buf = __builtin_ia32_pshufb128(buf, perm);
memcpy(dest+(i/4), &buf, 16);
}
return dest;
}
else
return CopyByConvert(dest, src, len);
}
#pragma GCC visibility pop
# 539 "include/util.hh" 2
# 34 "impl/block/block-plugin.hh" 2
# 1 "impl/block/blockcipher.hh" 1
# 32 "impl/block/blockcipher.hh"
#pragma GCC visibility push(hidden)
namespace drew {
template<size_t BlockSize, class E>
class BlockCipher {
public:
static const size_t block_size = BlockSize;
typedef E endian_t;
typedef AlignedBlock<uint8_t, BlockSize> FastBlock;
virtual ~BlockCipher() {}
virtual int Reset()
{
return 0;
}
virtual int SetKey(const uint8_t *key, size_t len)
{
keysz = len;
return SetKeyInternal(key, len);
}
virtual int GetKeySize() const
{
return keysz;
}
virtual int TestAvailability()
{
return 0;
}
virtual int Encrypt(uint8_t *out, const uint8_t *in) const = 0;
virtual int Decrypt(uint8_t *out, const uint8_t *in) const = 0;
virtual int EncryptFast(FastBlock *bout, const FastBlock *bin,
size_t n) const
{
if (BlockSize == 8) {
for (size_t i = 0; i < n/2; i++, bout++, bin++) {
Encrypt(bout->data, bin->data);
Encrypt(bout->data+8, bin->data+8);
}
}
else if (BlockSize == 16)
for (size_t i = 0; i < n; i++, bout++, bin++)
Encrypt(bout->data, bin->data);
else {
size_t off = 0;
for (size_t i = 0; i < n; i++, off += BlockSize)
Encrypt(bout->data+off, bin->data+off);
}
return 0;
}
virtual int DecryptFast(FastBlock *bout, const FastBlock *bin,
size_t n) const
{
if (BlockSize == 8) {
for (size_t i = 0; i < n/2; i++, bout++, bin++) {
Decrypt(bout->data, bin->data);
Decrypt(bout->data+8, bin->data+8);
}
}
else if (BlockSize == 16)
for (size_t i = 0; i < n; i++, bout++, bin++)
Decrypt(bout->data, bin->data);
else {
size_t off = 0;
for (size_t i = 0; i < n; i++, off += BlockSize)
Decrypt(bout->data+off, bin->data+off);
}
return 0;
}
protected:
virtual int SetKeyInternal(const uint8_t *key, size_t len) = 0;
size_t keysz;
private:
};
}
#pragma GCC visibility pop
# 36 "impl/block/block-plugin.hh" 2
# 31 "impl/block/aes-native//aes.hh" 2
#pragma GCC visibility push(hidden)
namespace drew {
class AESNative : public BlockCipher<16, BigEndian>
{
public:
AESNative() {}
~AESNative() {};
virtual int Encrypt(uint8_t *out, const uint8_t *in) const = 0;
virtual int Decrypt(uint8_t *out, const uint8_t *in) const = 0;
protected:
virtual int SetKeyInternal(const uint8_t *key, size_t sz) = 0;
static const size_t m_nb;
size_t m_nr, m_nk;
private:
};
class AESNI : public AESNative
{
public:
typedef long long vector_t __attribute__ ((vector_size (16)));
typedef int vector4i_t __attribute__ ((vector_size (16)));
AESNI();
~AESNI() {};
int Encrypt(uint8_t *out, const uint8_t *in) const;
int Decrypt(uint8_t *out, const uint8_t *in) const;
int EncryptFast(FastBlock *bout, const FastBlock *bin, size_t n) const;
int DecryptFast(FastBlock *bout, const FastBlock *bin, size_t n) const;
protected:
int SetKeyInternal(const uint8_t *key, size_t sz);
void SetKeyEncrypt(const uint8_t *key, size_t sz);
void SetKeyDecrypt(void);
void SetKeyEncrypt128(const uint8_t *key);
void SetKeyEncrypt192(const uint8_t *key);
void SetKeyEncrypt256(const uint8_t *key);
static const uint8_t rcon[];
vector_t m_rk[16], m_rkd[16];
};
}
#pragma GCC visibility pop
# 32 "impl/block/aes-native/aesni.cc" 2
#pragma GCC visibility push(hidden)
inline bool HasAESNI()
{
int res = 0;
uint32_t a, b, c, d;
res = GetCpuid(1, a, b, c, d);
if (res)
return false;
return c & 0x02000000;
}
namespace drew {
typedef AESNI AESImpl;
}
# 1 "impl/block/aes-native//aes-misc.cc" 1
const size_t drew::AESNative::m_nb = (block_size / 4);
extern "C" {
static const int rijndaelkeysz[] =
{
16, 24, 32
};
static const int aes128keysz[] = {16};
static const int aes192keysz[] = {24};
static const int aes256keysz[] = {32};
static void str2bytes(uint8_t *bytes, const char *s, size_t len = 0);
static bool test(const char *key, const char *plain, const char *cipher,
size_t keybytes = 0, size_t blocksz = 16)
{
using namespace drew;
uint8_t kb[32], pb[32], cb[32], buf[32];
str2bytes(kb, key, keybytes * 2);
str2bytes(pb, plain, blocksz * 2);
str2bytes(cb, cipher, blocksz * 2);
if (!keybytes)
keybytes = 16;
AESImpl ctx;
ctx.SetKey(kb, keybytes);
ctx.Encrypt(buf, pb);
if (memcmp(buf, cb, blocksz))
return false;
ctx.SetKey(kb, keybytes);
ctx.Decrypt(buf, cb);
return !memcmp(buf, pb, blocksz);
}
static void str2bytes(uint8_t *bytes, const char *s, size_t len)
{
if (!len)
len = strlen(s);
unsigned x;
for (size_t i = 0; i < (len / 2); i++) {
sscanf(s+(i*2), "%02x", &x);
bytes[i] = x;
}
}
static int rd_test(void *, const drew_loader_t *)
{
int res = 0;
const char *key =
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f";
const char *pt = "00112233445566778899aabbccddeeff";
res |= !test(key, pt, "69c4e0d86a7b0430d8cdb78070b4c55a", 16);
res |= !test(key, pt, "dda97ca4864cdfe06eaf70a0ec0d7191", 24);
res |= !test(key, pt, "8ea2b7ca516745bfeafc49904b496089", 32);
res <<= 1;
const char *key2 = "2b7e151628aed2a6abf7158809cf4f3c";
const char *pt1 = "6bc1bee22e409f96e93d7e117393172a";
const char *pt2 = "ae2d8a571e03ac9c9eb76fac45af8e51";
const char *pt3 = "30c81c46a35ce411e5fbc1191a0a52ef";
const char *pt4 = "f69f2445df4f9b17ad2b417be66c3710";
res |= !test(key2, pt1, "3ad77bb40d7a3660a89ecaf32466ef97");
res |= !test(key2, pt2, "f5d3d58503b9699de785895a96fdbaaf");
res |= !test(key2, pt3, "43b1cd7f598ece23881b00e3ed030688");
res |= !test(key2, pt4, "7b0c785e27e8ad3f8223207104725dd4");
res <<= 1;
const char *key3 = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b";
res |= !test(key3, pt1, "bd334f1d6e45f25ff712a214571fa5cc", 24);
res |= !test(key3, pt2, "974104846d0ad3ad7734ecb3ecee4eef", 24);
res |= !test(key3, pt3, "ef7afd2270e2e60adce0ba2face6444e", 24);
res |= !test(key3, pt4, "9a4b41ba738d6c72fb16691603c18e0e", 24);
res <<= 1;
const char *key4 =
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4";
res |= !test(key4, pt1, "f3eed1bdb5d2a03c064b5a7e3db181f8", 32);
res |= !test(key4, pt2, "591ccb10d410ed26dc5ba74a31362870", 32);
res |= !test(key4, pt3, "b6ed21b99ca6f4f9f153e7b1beafed1d", 32);
res |= !test(key4, pt4, "23304b7a39f9f3ff067d8d8f9e24ecc7", 32);
res <<= 1;
return res;
}
static int rijndaeltest(void *p, const drew_loader_t *ldr)
{
return rd_test(p, ldr);
}
static int aes128test(void *p, const drew_loader_t *ldr)
{
return rd_test(p, ldr);
}
static int aes192test(void *p, const drew_loader_t *ldr)
{
return rd_test(p, ldr);
}
static int aes256test(void *p, const drew_loader_t *ldr)
{
return rd_test(p, ldr);
}
static int rijndaelinfo(int op, void *p); static int rijndaelinfo2(const drew_block_t *, int, drew_param_t *, const drew_param_t *); static int rijndaelinit(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *); static int rijndaelclone(drew_block_t *newctx, const drew_block_t *oldctx, int flags); static int rijndaelreset(drew_block_t *ctx); static int rijndaelsetkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode); static int rijndaelencrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int rijndaeldecrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int rijndaelencryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int rijndaeldecryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int rijndaelfini(drew_block_t *ctx, int flags); static int rijndaeltest(void *, const drew_loader_t *); static const drew_block_functbl_t rijndaelfunctbl = { rijndaelinfo, rijndaelinfo2, rijndaelinit, rijndaelclone, rijndaelreset, rijndaelfini, rijndaelsetkey, rijndaelencrypt, rijndaeldecrypt, rijndaelencryptfast, rijndaeldecryptfast, rijndaeltest };; static int rijndaelclone(drew_block_t *newctx, const drew_block_t *oldctx, int flags) { using namespace drew; AESImpl *p; const AESImpl *q = reinterpret_cast<const AESImpl *>(oldctx->ctx); if (flags & 1) p = new (newctx->ctx) AESImpl(*q); else p = new AESImpl (*q); newctx->ctx = p; newctx->functbl = oldctx->functbl; return 0; } static int rijndaelsetkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->SetKey(key, len); } static int rijndaelreset(drew_block_t *ctx) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->Reset(); } static int rijndaelencrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Encrypt(out, in); } static int rijndaeldecrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Decrypt(out, in); } static int rijndaelencryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->EncryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int rijndaeldecryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->DecryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int rijndaelfini(drew_block_t *ctx, int flags) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); if (flags & 1) p->~AESImpl(); else { delete p; ctx->ctx = __null; } return 0; } static int rijndaelinfo(int op, void *p) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 3: for (size_t i = 0; i < (sizeof(rijndaelkeysz)/sizeof((rijndaelkeysz)[0])); i++) { const int *x = reinterpret_cast<int *>(p); if (rijndaelkeysz[i] > *x) return rijndaelkeysz[i]; } return 0; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int rijndaelinfo2(const drew_block_t *ctx, int op, drew_param_t *out, const drew_param_t *in) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 6: for (drew_param_t *p = out; p; p = p->next) if (!strcmp(p->name, "keySize")) { p->param.array.ptr = (void *)rijndaelkeysz; p->param.array.len = (sizeof(rijndaelkeysz)/sizeof((rijndaelkeysz)[0])); } return 0; case 7: if (ctx && ctx->ctx) { const AESImpl *ctxp = (const AESImpl *)ctx->ctx; return ctxp->GetKeySize(); } return -0x10007; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int rijndaelinit(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *) { using namespace drew; AESImpl *p; int res = 0; if (flags & 1) p = new (ctx->ctx) AESImpl; else p = new AESImpl; ctx->ctx = p; ctx->functbl = &rijndaelfunctbl; if ((res = p->TestAvailability())) { rijndaelfini(ctx, flags); return res; } return 0; }
static int aes128info(int op, void *p); static int aes128info2(const drew_block_t *, int, drew_param_t *, const drew_param_t *); static int aes128init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *); static int aes128clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags); static int aes128reset(drew_block_t *ctx); static int aes128setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode); static int aes128encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes128decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes128encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes128decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes128fini(drew_block_t *ctx, int flags); static int aes128test(void *, const drew_loader_t *); static const drew_block_functbl_t aes128functbl = { aes128info, aes128info2, aes128init, aes128clone, aes128reset, aes128fini, aes128setkey, aes128encrypt, aes128decrypt, aes128encryptfast, aes128decryptfast, aes128test };; static int aes128clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags) { using namespace drew; AESImpl *p; const AESImpl *q = reinterpret_cast<const AESImpl *>(oldctx->ctx); if (flags & 1) p = new (newctx->ctx) AESImpl(*q); else p = new AESImpl (*q); newctx->ctx = p; newctx->functbl = oldctx->functbl; return 0; } static int aes128setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->SetKey(key, len); } static int aes128reset(drew_block_t *ctx) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->Reset(); } static int aes128encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Encrypt(out, in); } static int aes128decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Decrypt(out, in); } static int aes128encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->EncryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes128decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->DecryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes128fini(drew_block_t *ctx, int flags) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); if (flags & 1) p->~AESImpl(); else { delete p; ctx->ctx = __null; } return 0; } static int aes128info(int op, void *p) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 3: for (size_t i = 0; i < (sizeof(aes128keysz)/sizeof((aes128keysz)[0])); i++) { const int *x = reinterpret_cast<int *>(p); if (aes128keysz[i] > *x) return aes128keysz[i]; } return 0; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes128info2(const drew_block_t *ctx, int op, drew_param_t *out, const drew_param_t *in) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 6: for (drew_param_t *p = out; p; p = p->next) if (!strcmp(p->name, "keySize")) { p->param.array.ptr = (void *)aes128keysz; p->param.array.len = (sizeof(aes128keysz)/sizeof((aes128keysz)[0])); } return 0; case 7: if (ctx && ctx->ctx) { const AESImpl *ctxp = (const AESImpl *)ctx->ctx; return ctxp->GetKeySize(); } return -0x10007; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes128init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *) { using namespace drew; AESImpl *p; int res = 0; if (flags & 1) p = new (ctx->ctx) AESImpl; else p = new AESImpl; ctx->ctx = p; ctx->functbl = &aes128functbl; if ((res = p->TestAvailability())) { aes128fini(ctx, flags); return res; } return 0; }
static int aes192info(int op, void *p); static int aes192info2(const drew_block_t *, int, drew_param_t *, const drew_param_t *); static int aes192init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *); static int aes192clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags); static int aes192reset(drew_block_t *ctx); static int aes192setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode); static int aes192encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes192decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes192encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes192decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes192fini(drew_block_t *ctx, int flags); static int aes192test(void *, const drew_loader_t *); static const drew_block_functbl_t aes192functbl = { aes192info, aes192info2, aes192init, aes192clone, aes192reset, aes192fini, aes192setkey, aes192encrypt, aes192decrypt, aes192encryptfast, aes192decryptfast, aes192test };; static int aes192clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags) { using namespace drew; AESImpl *p; const AESImpl *q = reinterpret_cast<const AESImpl *>(oldctx->ctx); if (flags & 1) p = new (newctx->ctx) AESImpl(*q); else p = new AESImpl (*q); newctx->ctx = p; newctx->functbl = oldctx->functbl; return 0; } static int aes192setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->SetKey(key, len); } static int aes192reset(drew_block_t *ctx) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->Reset(); } static int aes192encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Encrypt(out, in); } static int aes192decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Decrypt(out, in); } static int aes192encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->EncryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes192decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->DecryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes192fini(drew_block_t *ctx, int flags) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); if (flags & 1) p->~AESImpl(); else { delete p; ctx->ctx = __null; } return 0; } static int aes192info(int op, void *p) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 3: for (size_t i = 0; i < (sizeof(aes192keysz)/sizeof((aes192keysz)[0])); i++) { const int *x = reinterpret_cast<int *>(p); if (aes192keysz[i] > *x) return aes192keysz[i]; } return 0; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes192info2(const drew_block_t *ctx, int op, drew_param_t *out, const drew_param_t *in) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 6: for (drew_param_t *p = out; p; p = p->next) if (!strcmp(p->name, "keySize")) { p->param.array.ptr = (void *)aes192keysz; p->param.array.len = (sizeof(aes192keysz)/sizeof((aes192keysz)[0])); } return 0; case 7: if (ctx && ctx->ctx) { const AESImpl *ctxp = (const AESImpl *)ctx->ctx; return ctxp->GetKeySize(); } return -0x10007; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes192init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *) { using namespace drew; AESImpl *p; int res = 0; if (flags & 1) p = new (ctx->ctx) AESImpl; else p = new AESImpl; ctx->ctx = p; ctx->functbl = &aes192functbl; if ((res = p->TestAvailability())) { aes192fini(ctx, flags); return res; } return 0; }
static int aes256info(int op, void *p); static int aes256info2(const drew_block_t *, int, drew_param_t *, const drew_param_t *); static int aes256init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *); static int aes256clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags); static int aes256reset(drew_block_t *ctx); static int aes256setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode); static int aes256encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes256decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in); static int aes256encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes256decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n); static int aes256fini(drew_block_t *ctx, int flags); static int aes256test(void *, const drew_loader_t *); static const drew_block_functbl_t aes256functbl = { aes256info, aes256info2, aes256init, aes256clone, aes256reset, aes256fini, aes256setkey, aes256encrypt, aes256decrypt, aes256encryptfast, aes256decryptfast, aes256test };; static int aes256clone(drew_block_t *newctx, const drew_block_t *oldctx, int flags) { using namespace drew; AESImpl *p; const AESImpl *q = reinterpret_cast<const AESImpl *>(oldctx->ctx); if (flags & 1) p = new (newctx->ctx) AESImpl(*q); else p = new AESImpl (*q); newctx->ctx = p; newctx->functbl = oldctx->functbl; return 0; } static int aes256setkey(drew_block_t *ctx, const uint8_t *key, size_t len, int mode) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->SetKey(key, len); } static int aes256reset(drew_block_t *ctx) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); return p->Reset(); } static int aes256encrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Encrypt(out, in); } static int aes256decrypt(const drew_block_t *ctx, uint8_t *out, const uint8_t *in) { using namespace drew; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->Decrypt(out, in); } static int aes256encryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->EncryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes256decryptfast(const drew_block_t *ctx, uint8_t *out, const uint8_t *in, size_t n) { using namespace drew; typedef AESImpl::FastBlock FastBlock; const AESImpl *p = reinterpret_cast<const AESImpl *>(ctx->ctx); return p->DecryptFast((FastBlock *)out, (const FastBlock *)in, n); } static int aes256fini(drew_block_t *ctx, int flags) { using namespace drew; AESImpl *p = reinterpret_cast<AESImpl *>(ctx->ctx); if (flags & 1) p->~AESImpl(); else { delete p; ctx->ctx = __null; } return 0; } static int aes256info(int op, void *p) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 3: for (size_t i = 0; i < (sizeof(aes256keysz)/sizeof((aes256keysz)[0])); i++) { const int *x = reinterpret_cast<int *>(p); if (aes256keysz[i] > *x) return aes256keysz[i]; } return 0; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes256info2(const drew_block_t *ctx, int op, drew_param_t *out, const drew_param_t *in) { using namespace drew; switch (op) { case 0: return 3; case 2: return AESImpl::block_size; case 4: return AESImpl::endian_t::GetEndianness(); case 6: for (drew_param_t *p = out; p; p = p->next) if (!strcmp(p->name, "keySize")) { p->param.array.ptr = (void *)aes256keysz; p->param.array.len = (sizeof(aes256keysz)/sizeof((aes256keysz)[0])); } return 0; case 7: if (ctx && ctx->ctx) { const AESImpl *ctxp = (const AESImpl *)ctx->ctx; return ctxp->GetKeySize(); } return -0x10007; case 5: return sizeof(AESImpl); default: return -0x10006; } } static int aes256init(drew_block_t *ctx, int flags, const drew_loader_t *, const drew_param_t *) { using namespace drew; AESImpl *p; int res = 0; if (flags & 1) p = new (ctx->ctx) AESImpl; else p = new AESImpl; ctx->ctx = p; ctx->functbl = &aes256functbl; if ((res = p->TestAvailability())) { aes256fini(ctx, flags); return res; } return 0; }
static struct plugin plugin_data[] = {
{ "Rijndael", & rijndaelfunctbl },
{ "AES128", & aes128functbl },
{ "AES192", & aes192functbl },
{ "AES256", & aes256functbl },
};
}
# 58 "impl/block/aes-native/aesni.cc" 2
extern "C" {
#pragma GCC visibility push(default)
int drew_plugin_info_aesni(void *ldr, int op, int id, void *p)
{
int nplugins = HasAESNI() ? sizeof(plugin_data)/sizeof(plugin_data[0]) : 0;
if (id < 0 || id >= nplugins) {
if (!id && !nplugins && op == 3)
return 0;
else
return -0x10006;
}
switch (op) {
case 2:
return 0;
case 3:
return nplugins;
case 4:
return 2;
case 5:
return sizeof(drew_block_functbl_t);
case 6:
memcpy(p, plugin_data[id].functbl, sizeof(drew_block_functbl_t));
return 0;
case 7:
return strlen(plugin_data[id].name) + 1;
case 8:
memcpy(p, plugin_data[id].name, strlen(plugin_data[id].name)+1);
return 0;
default:
return -0x10006;
}
}
#pragma GCC visibility pop
}
drew::AESNI::AESNI()
{
}
int drew::AESNI::SetKeyInternal(const uint8_t *key, size_t len)
{
switch (len) {
case 16:
case 24:
case 32:
break;
case 20:
case 28:
return -0x10005;
default:
return -0x10006;
}
m_nk = (len / 4);
m_nr = 6 + std::max(m_nb, m_nk);
SetKeyEncrypt(key, len);
SetKeyDecrypt();
return 0;
}
typedef drew::AESNI::vector_t vector_t;
typedef drew::AESNI::vector4i_t vector4i_t;
void drew::AESNI::SetKeyEncrypt(const uint8_t *key, size_t len)
{
const size_t shortlen = len / 4;
uint32_t *rk = (uint32_t *)m_rk, *rko;
vector_t t;
const uint8_t *rc = rcon;
memcpy(&t, key+len-16, 16);
memcpy(rk, key, len);
rko = rk;
for (;; rk += shortlen) {
vector_t t2;
t2 = __builtin_ia32_aeskeygenassist128(t, 0);
rk[shortlen+0] = rk[0] ^
__builtin_ia32_vec_ext_v4si(vector4i_t(t2), 3) ^ *(rc++);
rk[shortlen+1] = rk[1] ^ rk[shortlen+0];
rk[shortlen+2] = rk[2] ^ rk[shortlen+1];
rk[shortlen+3] = rk[3] ^ rk[shortlen+2];
if (rk + shortlen + 4 == rko + (4 * (m_nr + 1)))
break;
if (len == 24) {
rk[10] = rk[4] ^ rk[9];
rk[11] = rk[5] ^ rk[10];
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
}
else if (len == 32) {
t =(vector_t) __builtin_ia32_vec_set_v4si(vector4i_t(t), rk[11], 3);
t2 = __builtin_ia32_aeskeygenassist128(t, 0);
rk[12] = rk[4] ^ __builtin_ia32_vec_ext_v4si(vector4i_t(t2), 2);
rk[13] = rk[5] ^ rk[12];
rk[14] = rk[6] ^ rk[13];
rk[15] = rk[7] ^ rk[14];
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[15], 3);
}
else
t = (vector_t)__builtin_ia32_vec_set_v4si(vector4i_t(t), rk[7], 3);
}
}
void drew::AESNI::SetKeyDecrypt(void)
{
vector_t *rkd = m_rkd;
memcpy(m_rkd, m_rk, sizeof(m_rkd));
for (size_t i = 0, j = m_nr; i < j; i++, j--)
std::swap(rkd[i], rkd[j]);
for (size_t i = 1; i < m_nr; i++)
rkd[i] = __builtin_ia32_aesimc128(rkd[i]);
}
int drew::AESNI::Encrypt(uint8_t *out, const uint8_t *in) const
{
vector_t data;
memcpy(&data, in, 16);
data ^= m_rk[0];
for (size_t i = 1; i < m_nr; i++)
data = __builtin_ia32_aesenc128(data, m_rk[i]);
data = __builtin_ia32_aesenclast128(data, m_rk[m_nr]);
memcpy(out, &data, 16);
return 0;
}
int drew::AESNI::Decrypt(uint8_t *out, const uint8_t *in) const
{
vector_t data;
memcpy(&data, in, 16);
data ^= m_rkd[0];
for (size_t i = 1; i < m_nr; i++)
data = __builtin_ia32_aesdec128(data, m_rkd[i]);
data = __builtin_ia32_aesdeclast128(data, m_rkd[m_nr]);
memcpy(out, &data, 16);
return 0;
}
int drew::AESNI::EncryptFast(FastBlock *bout, const FastBlock *bin,
size_t n) const
{
const vector_t *in = (const vector_t *)bin;
vector_t *out = (vector_t *)bout;
vector_t x0 = m_rk[0], x1 = m_rk[1], x2 = m_rk[2], x3 = m_rk[3];
vector_t x4 = m_rk[4], x5 = m_rk[5], x6 = m_rk[6], x7 = m_rk[7];
vector_t x8 = m_rk[8], x9 = m_rk[9], x10 = m_rk[10], x11 = m_rk[11];
vector_t x12 = m_rk[12], x13 = m_rk[13], x14 = m_rk[14];
for (size_t i = 0; i < n; i++, in++, out++) {
vector_t data;
data = *in ^ x0;
data = __builtin_ia32_aesenc128(data, x1);
data = __builtin_ia32_aesenc128(data, x2);
data = __builtin_ia32_aesenc128(data, x3);
data = __builtin_ia32_aesenc128(data, x4);
data = __builtin_ia32_aesenc128(data, x5);
data = __builtin_ia32_aesenc128(data, x6);
data = __builtin_ia32_aesenc128(data, x7);
data = __builtin_ia32_aesenc128(data, x8);
data = __builtin_ia32_aesenc128(data, x9);
if (m_nr == 10)
data = __builtin_ia32_aesenclast128(data, x10);
else {
data = __builtin_ia32_aesenc128(data, x10);
data = __builtin_ia32_aesenc128(data, x11);
if (m_nr == 12)
data = __builtin_ia32_aesenclast128(data, x12);
else {
data = __builtin_ia32_aesenc128(data, x12);
data = __builtin_ia32_aesenc128(data, x13);
data = __builtin_ia32_aesenclast128(data, x14);
}
}
*out = data;
}
return 0;
}
int drew::AESNI::DecryptFast(FastBlock *bout, const FastBlock *bin,
size_t n) const
{
const vector_t *in = (const vector_t *)bin;
vector_t *out = (vector_t *)bout;
vector_t x0 = m_rkd[0], x1 = m_rkd[1], x2 = m_rkd[2], x3 = m_rkd[3];
vector_t x4 = m_rkd[4], x5 = m_rkd[5], x6 = m_rkd[6], x7 = m_rkd[7];
vector_t x8 = m_rkd[8], x9 = m_rkd[9], x10 = m_rkd[10], x11 = m_rkd[11];
vector_t x12 = m_rkd[12], x13 = m_rkd[13], x14 = m_rkd[14];
for (size_t i = 0; i < n; i++, in++, out++) {
vector_t data;
data = *in ^ x0;
data = __builtin_ia32_aesdec128(data, x1);
data = __builtin_ia32_aesdec128(data, x2);
data = __builtin_ia32_aesdec128(data, x3);
data = __builtin_ia32_aesdec128(data, x4);
data = __builtin_ia32_aesdec128(data, x5);
data = __builtin_ia32_aesdec128(data, x6);
data = __builtin_ia32_aesdec128(data, x7);
data = __builtin_ia32_aesdec128(data, x8);
data = __builtin_ia32_aesdec128(data, x9);
if (m_nr == 10)
data = __builtin_ia32_aesdeclast128(data, x10);
else {
data = __builtin_ia32_aesdec128(data, x10);
data = __builtin_ia32_aesdec128(data, x11);
if (m_nr == 12)
data = __builtin_ia32_aesdeclast128(data, x12);
else {
data = __builtin_ia32_aesdec128(data, x12);
data = __builtin_ia32_aesdec128(data, x13);
data = __builtin_ia32_aesdeclast128(data, x14);
}
}
*out = data;
}
return 0;
}
const uint8_t drew::AESNI::rcon[] = {
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
};
#pragma GCC visibility pop
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/pkg-llvm-team/attachments/20111226/5afdac4a/attachment-0001.pgp>
More information about the Pkg-llvm-team
mailing list